这与很多问题密切相关,包括我自己的一个问题:TensorFlow Inference
TensorFlow中用于推理的每个样本似乎都遵循以下形式:
import tensorflow as tf
import CONSTANTS
import Vgg3CIFAR10
import numpy as np
MODEL_PATH = 'models/' + CONSTANTS.MODEL_NAME + '.model'
rand = np.random.rand(1, 32, 32, 3).astype(np.float32)
images = tf.placeholder(tf.float32, shape=(1, 32, 32, 3))
logits = Vgg3CIFAR10.inference(images)
def run_inference():
'''Runs inference against a loaded model'''
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
new_saver = tf.train.import_meta_graph(MODEL_PATH + '.meta')
new_saver.restore(sess, MODEL_PATH)
print(sess.run(logits, feed_dict={images : rand}))
print('done')
run_inference()
的问题:
恢复模型&图表就是这样...除了我在这里创建一个并行图形,我可能可能向图形中添加新零件。 (只有附加张量流图除外;因此,如果附加了图,如何添加到图中并仅运行该段;它会想要运行整个图。
加载图中存在的队列运行器会发生什么变化;所有这些操作都已加载。通过打印出sess.graph.get_operations(),您可以看到所有旧的输入操作都在那里。
logits = Vgg3CIFAR10.inference(图片)是否没有将新项目附加到图表中?如果是因为命名;那么占位符输入会替换队列运行器吗?
一些项目的可能答案:因为我首先定义了logits;这意味着在此之后附加了图表的其余部分;并通过一些tensorflow魔术酱,原始图形中的变量被恢复到图形的logits部分?
所以我测试了这个;它甚至无法正常工作......
首先创建一个带有logits的图形,然后它将旧图形附加到该图形。所以当你打电话推断;你只是得到一堆垃圾......
[[0.09815982 0.09611271 0.10542709 0.10383813 0.0955615 0.10979554 0.12138291 0.09316944 0.08336139 0.09319157]]
[[0.10305423 0.092167 0.10572157 0.10368075 0.1043573 0.10057402 0.12435613 0.08916584 0.07929172 0.09763144]]
[[0.1068181 0.09361464 0.10377798 0.10060066 0.10110897 0.09462726 0.11688241 0.09941135 0.0869903 0.09616835]]
在这里,我期待节点8后跟节点2和2成为浮出水面......显然它只是一堆没有......
答案 0 :(得分:0)
经过大量的审查后,这就是发生的事情......
如果在恢复图表之前向图表添加任何内容;已恢复的图形将附加到已创建的图形。
恢复变量时,在恢复变量时,会在图表中查找变量名称,其名称与存储在元文件中的变量的名称相同。如果您创建了具有相同变量名称的图形,然后还原了具有相同变量名称的图形,则我运行的测试显示附加的存储图形接收变量的恢复而不是初始图形。
< / LI> 醇>总结如此;小心你正在用你的图表做什么,并非常清楚如何附加/恢复事物。如果你正在考虑这个,希望找到推论;然后看看这个S.O.其中答案涉及创建一个新图并将变量恢复到新图中,这实际上是原图的子图。