图像识别教程中的张量流练习建议运行c ++示例
--output_layer=pool_3
。我试过运行它并收到错误:
$ bazel-bin/tensorflow/examples/label_image/label_image --output_layer=pool_3
I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 4
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 4
W tensorflow/core/common_runtime/executor.cc:1076] 0x558ae6a5d210 Compute status: Invalid argument: input must be 2-dimensional
[[Node: top_k = TopK[T=DT_FLOAT, k=5, _device="/job:localhost/replica:0/task:0/cpu:0"](Const/_0)]]
E tensorflow/examples/label_image/main.cc:311] Running print failed: Invalid argument: input must be 2-dimensional
[[Node: top_k = TopK[T=DT_FLOAT, k=5, _device="/job:localhost/replica:0/task:0/cpu:0"](Const/_0)]]
我错过了什么?
答案 0 :(得分:3)
这里的问题是image recognition tutorial中的TensorFlow代码需要在--output_layer=pool_3
选项起作用之前进行额外修改:
可以通过在C ++ API示例中设置
--output_layer=pool_3
,然后更改输出张量处理来指定。
要更改输出张量处理,您需要修改代码below this line in label_image/main.cc
。 PrintTopLabels()
函数调用GetTopLabels()
,它将单个2-D(批处理x类)张量假设为tf.nn.softmax()
的输出,其中包含批处理中标签的概率分布图像 - 并使用tf.nn.top_k()
操作构建一个小的TensorFlow图。 pool_3
图层输出四维(批x高x宽x深)张量,需要额外处理。
附加处理留给读者练习。但是,您可以尝试一些事项:
将输出重新整形为二维(批量x要素)矩阵,并训练完全连接的图层(或更多)以识别您自己的训练数据中的要素。
通过沿深度维度切片,并使用tf.image.encode_png()
操作将切片编码为图像,可视化池化图层的输出。
N.B。由于文档更好,我提供了Python文档的链接,而不是相应的C ++ API。您可能会发现(更多!)更容易修改Python code for Inception inference。