TensorFlow:加载模型,只对图像进行正向传递

时间:2018-04-23 16:52:25

标签: python tensorflow machine-learning

是否可以加载我的模型,只对图像进行一次前向操作。

我的网络定义如下:

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."

但我该怎么办?

2 个答案:

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