此问题有多种可能的原因。首先想到的是模型中的权重在导入时可能会被初始化为零。如果图中定义了初始化(参见loader),则可能会发生这种情况。要检查这一点,请使用以下命令:
from tensorflow.contrib.session_bundle import session_bundle
session, _ = session_bundle.load_session_bundle_from_path("/path/to/model")
print(s.graph.get_collection("serving_init_op"))
如果该集合中有东西,请确保它没有初始化变量。
如果没有初始化器,请确保权重本身看起来合理,例如,
session, _ = session_bundle.load_session_bundle_from_path("/path/to/model")
print(session.run("name_of_var:0"))
如果所有这些都得到验证,那么您可能需要注意图表的输入以及转换这些输入后的输出。为此,您可以使用session.run
运行图的部分。例如,您可以提供一个 jpeg 字符串,并通过在调用session.run
.
例如,使用这篇文章中的示例,我们可以从磁盘加载 JPEG,将其输入到图形中,然后查看调整大小和缩放后的数据是什么样子:
INPUT_PLACEHOLDER = 'Placeholder:0'
DECODE_AND_RESIZE = 'map/TensorArrayPack_1/TensorArrayGather:0'
SCALED = 'Mul:0'
# Read in a sample image, preferably with small dimensions.
jpg = open("/tmp/testing22222.jpg", "rb").read()
session, _ = session_bundle.load_session_bundle_from_path("/path/to/model")
resized, scaled = session.run([DECODE_AND_RESIZE, SCALED], feed_dict={INPUT_PLACEHOLDER: [jpg]})
通过战略性地将张量的名称放置在列表中的图表中fetch
,您可以检查神经网络的任何给定层中正在发生的事情,尽管最可能的问题在于输入和/或变量。
棘手的部分是找出张量的名称。您可以name
在定义大多数操作时使用该属性,这可能会有所帮助。你也可以使用类似的东西:
print([o.name for o in session.graph.get_operations()])
帮助检查图中的操作。
最后,您可能还想尝试在本地运行图表,以便在调试时最小化反馈周期。查看示例中的local_predict.py以获取有关如何执行此操作的示例。这将帮助您快速迭代以识别模型本身的问题。