我的规格: Windows 10 64, Python 3.6, Tensorflow 1.0.1。
我一直在尝试训练和使用神经网络MNIST数据集:
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data", one_hot=True)
tf.reset_default_graph()
n_nodes_hl1 = 500
n_nodes_hl2 = 500
n_nodes_hl3 = 500
n_classes = 10
batch_size = 100
x = tf.placeholder('float',[None,784])
y = tf.placeholder('float')
current_epoch = tf.Variable(1)
def neural_network_model(data):
hidden_1_layer = {'weights': tf.Variable(tf.random_normal([784,n_nodes_hl1])),
'biases': tf.Variable(tf.random_normal([n_nodes_hl1]))
}
hidden_2_layer = {'weights': tf.Variable(tf.random_normal([n_nodes_hl1,n_nodes_hl2])),
'biases': tf.Variable(tf.random_normal([n_nodes_hl2]))
}
hidden_3_layer = {'weights': tf.Variable(tf.random_normal([n_nodes_hl2,n_nodes_hl3])),
'biases': tf.Variable(tf.random_normal([n_nodes_hl3]))
}
output_layer = {'weights': tf.Variable(tf.random_normal([n_nodes_hl3,n_classes])),
'biases': tf.Variable(tf.random_normal([n_classes]))
}
l1 = tf.add(tf.matmul(data, hidden_1_layer['weights']), hidden_1_layer['biases'])
l1 = tf.nn.relu(l1)
l2 = tf.add(tf.matmul(l1, hidden_2_layer['weights']), hidden_2_layer['biases'])
l2 = tf.nn.relu(l2)
l3 = tf.add(tf.matmul(l2, hidden_3_layer['weights']), hidden_3_layer['biases'])
l3 = tf.nn.relu(l3)
output = tf.matmul(l3, output_layer['weights']) + output_layer['biases']
return output
saver = tf.train.Saver()
def train_neural_network(x):
prediction = neural_network_model(x)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=y))
optimizer = tf.train.AdamOptimizer().minimize(cost)
hm_epochs = 10
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(hm_epochs):
epoch_loss = 0
for _ in range(int(mnist.train.num_examples/batch_size)):
epoch_x,epoch_y = mnist.train.next_batch(batch_size)
_, c = sess.run([optimizer, cost], feed_dict = {x:epoch_x, y:epoch_y})
epoch_loss += c
correct = tf.equal(tf.arg_max(prediction,1), tf.arg_max(y,1))
accuracy = tf.reduce_mean(tf.cast(correct,'float'))
saver.save(sess, "/tmp/model.ckpt")
train_neural_network(x)
之后我通过训练有素的模型传递了一个MNIST图像:
import cv2
import numpy as np
mn = cv2.imread('352.png')
mn = cv2.cvtColor(mn,cv2.COLOR_BGR2GRAY)
mn2 = np.array(list(mn.flatten()))
x = tf.placeholder('float')
y = tf.placeholder('float')
with tf.Session() as sess:
prediction = neural_network_model(x)
sess.run(tf.global_variables_initializer())
saver.restore(sess,"/tmp/model.ckpt")
result = (sess.run(tf.argmax(prediction.eval(feed_dict={x:[ mn2 ]}),1)))
print(prediction.eval(feed_dict={x:[mn2]}))
print(result)
不幸的是,模型精度为ca. 95%我一直得到错误的结果 - 不仅错误,而且在不同的运行中也不一致
我们说我通过了8号图像,我得到了9,4,3 ......
模型文件model.ckpt.data-00000-of-00001保存到硬盘驱动器大约是10兆字节。当我在为每个循环进行训练时尝试恢复模型时(如pythonprogramming.net课程所示)模型似乎没有更新,因为文件只有1KB。
我在这里做错了什么?