Predict wrong number using CNN model [closed]
Hello
OpenCV 3.4.1
Python 3.6
Tensorflow 1.5.0
There is CNN LeNet sample code and train 99% accuracy.
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data/', one_hot = True)
sess = tf.InteractiveSession()
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev = 0.1)
return tf.Variable(initial)
def bias_variable(shape):
initial = tf.constant(0.1, shape = shape)
return tf.Variable(initial)
def conv2d(x,W):
return tf.nn.conv2d(x, W, strides = [1, 1, 1, 1], padding ='SAME')
def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize = [1, 2, 2, 1], strides = [1, 2, 2, 1],padding='SAME')
x = tf.placeholder(tf.float32, [None, 784], name='input')
x_image = tf.reshape(x, [-1,28,28,1])
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
W_fc1 = weight_variable([7*7*64, 1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
y_conv = tf.nn.softmax(tf.matmul(h_fc1, W_fc2) + b_fc2, name='softmax')
tf.train.write_graph(sess.graph_def, './save_folder/', 'graph.pbtxt', as_text=True)
tf.train.write_graph(sess.graph_def, './save_folder/', 'graph.pb', as_text=False)
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices = [1]))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
tf.global_variables_initializer().run()
saver = tf.train.Saver()
for i in range(1000):
batch = mnist.train.next_batch(100)
if i%100 ==0:
train_accuracy = accuracy.eval(feed_dict= {x: batch[0], y_: batch[1]})
print('step %d, training accuracy %g' %(i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_: batch[1]})
saver.save(sess, "./save_folder/model.ckpt")
But when I applied this model in opencv using c++, it predicted almost wrong in mnist test dataset.
Below link is .pb file combined with .ckpt and graph. https://drive.google.com/file/d/1nN_u...
Thanks
@Hank538, Have you tried to run the model using TensorFlow? How it could be that
W_fc2
layer has 3211264 parameters that approximately 13MB butfrozen.pb
takes less than 32KB? Please check the references.Oh! No idea how make it wrong. Renew link for 12 MB pb file. https://drive.google.com/file/d/1nN_u...