是否可以加载我的模型,只对图像进行一次前向操作。
我的网络定义如下:
def network(x, weights, biases, name="network"):
# 1. Hidden layer, ReLU
layer_1 = tf.add(tf.matmul(x, weights["h1"]), biases["b1"])
layer_1 = tf.nn.relu(layer_1)
# 2. Hidden layer, ReLU
layer_2 = tf.add(tf.matmul(layer_1, weights["h2"]), biases["b2"])
layer_2 = tf.nn.relu(layer_2)
# Output layer with linear activation
out_layer = tf.add(tf.matmul(layer_2, weights["out"]), biases["bout"])
return out_layer
pred = network(x, weights, biases, name="network")
我遇到了困难:
import tensorflow as tf
import numpy as np
test_image = np.random.randn(900,1)
with tf.Session() as sess:
saver = tf.train.import_meta_graph("my_model.meta")
saver.restore(sess, tf.train.latest_checkpoint("/dir/to/model"))
op_to_restore = graph.get_tensor_by_name("network:0")
当我这样做时,我收到以下错误:
KeyError: "The name 'network:0' refers to a Tensor which does not exist. The operation, 'network', does not exist in the graph."
但我该怎么办?
答案 0 :(得分:3)
定义模型时,可以定义图形。此图包含操作(节点),每个节点都有唯一的名称。
如果您没有为节点明确设置名称,Tensorflow会为您指定一个名称。
如果要执行评估节点所需的操作链,则必须知道其名称。
在您的情况下,您必须找到out_layer
的名称。您可以使用属性.name
访问其名称。
pred = network(x, weights, biases, name="network")
name = pred.name
print(name)
保存此名称。
现在,您可以像以前一样恢复图表,并且可以在图表中查找正确的名称:
graph.get_tensor_by_name(name)
其中name是上面执行的print(name)
返回的字符串。
答案 1 :(得分:2)
您需要知道输出节点的名称(提供预测)和输入节点(输入数据的位置)。
然后,您可以在会话中运行输出节点,并使用输入节点的feed dict输入输入图像。类似的东西:
model_result = sess.run(output_node , feed_dict ={input_node : test_image})
编辑: 您还没有给出您的操作名称,因此Tensorflow将为其指定默认名称。您收到错误,因为network:0不是Tensorflow图中任何张量的名称。
您可以使用' name=place_your_name_here
'为您的操作添加名称。作为您的操作的参数,您将定义例如。
tf.add(tf.matmul(layer_2, weights["out"]), biases["bout"], name='output')