如何使用以前训练过的模型来获取图像标签 - TensorFlow

时间:2016-10-15 15:38:43

标签: python python-2.7 machine-learning neural-network tensorflow

我训练了一个模型(按照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教程有很大不同。

2 个答案:

答案 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);