我训练了一个模型(按照MNIST tutorial)并保存了它:
saver = tf.train.Saver()
save_path = saver.save(sess,'/path/to/model.ckpt')
我想使用保存的模型来查找新批次图像的标签。我加载模型并用数据库测试它:
# load MNIST data
folds = build_database_tuple.load_data(data_home_dir='/path/to/database')
# starting the session. using the InteractiveSession we avoid build the entiee comp. graph before starting the session
sess = tf.InteractiveSession()
# start building the computational graph
...
BUILD AND DEFINE ALL THE LAYERS
...
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
# TRAIN AND EVALUATION:
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))
sess.run(tf.initialize_all_variables())
saver = tf.train.Saver()
# Restore variables from disk.
savepath = '/path/to/model.ckpt'
saver.restore(sess, save_path=savepath)
print("Model restored.")
print("test accuracy %g"%accuracy.eval(feed_dict={x: folds.test.images, y_: folds.test.labels, keep_prob: 1.0}))
虽然我可以加载并测试模型,但如何获取包含数据库图像预测的y'数组?
我扫描了网页并找到了很多关于这个问题的答案,但是我无法将这些答案适合这个特殊情况。例如,我找到了关于CIFAR10教程的this answer,但它与MNIST教程有很大不同。
答案 0 :(得分:6)
定义用于执行分类的OP,例如
predictor = tf.argmax(y_conv,1)
然后在具有新输入的训练模型上运行
print(sess.run(predictor, feed_dict={ x = new_data }))
因为"预测者"不依赖y
你不必提供它,这仍然会执行。
如果您只想查看测试图像的预测,您还可以通过删除准确性评估和执行
来在一次运行调用中执行这两项操作acc, predictions = sess.run([accuracy, predictor],
feed_dict={x: folds.test.images,
y_: folds.test.labels,
keep_prob: 1.0}))
print('Accuracy', acc)
print('Predictions', predictions)
答案 1 :(得分:-1)
lejlot刚刚回答的另一个选项(此选项主要用于学习和理解网络正在做什么)可能是:您可以使用前馈使用您的网络已经学习的权重和偏差进行预测,这意味着您在“构建和定义所有层”中定义的计算应该应用于新数据集,例如假设您的网络具有形状输入 - > relu层 - > softmax层。你会计算:
relu_layer_oututs = tf.nn.relu(tf.matmul(input_data,weights_layer1)+biases_layer1 );
prediction = tf.nn.softmax(tf.matmul(relu_layer_outputs,weights_layer2)+biases_layer2);