我想使用转移学习与谷歌的盗梦空间网络,以解决图像识别问题。我正在使用来自retrain.py
示例源的TensorFlow作为灵感。
在retrain.py
中,将加载盗梦空间图,并使用提要dict将新图像输入到模型的输入层。但是,我已经在TFRecord文件中序列化了我的数据,并且一直在使用一个输入管道来输入我的输入,如演示的这里。
因此,我有一个张量images
,它在运行时以批形式返回输入数据。但我如何将这些图像输入“盗梦空间”呢?我不能使用提要dict,因为我的输入是张量,而不是NumPy数组。我的两个想法是
1)只需在每个批处理上调用sess.run()
,将其转换为NumPy数组,然后使用提要块将其传递给盗梦空间。
2)用我自己的批处理输入张量替换初始空间图中的输入节点
我认为(1)会有用,但它似乎有点不雅。(2)对我来说似乎更自然,但我不能做到这一点,因为TensorFlow图只能被附加,而不能被修改。
有没有更好的方法?
发布于 2017-01-30 16:20:24
您可以实现选项(2),替换输入节点,但需要修改retrain.py
才能这样做。tf.import_graph_def()
函数通过将导入图中的张量重映射到目标图中的现有张量,从而支持对导入图的有限形式的修改。
retrain.py
调用tf.import_graph_def()
导入初始模型,其中jpeg_data_tensor
成为输入数据输入的张量:
bottleneck_tensor, jpeg_data_tensor, resized_input_tensor = (
tf.import_graph_def(graph_def, name='', return_elements=[
BOTTLENECK_TENSOR_NAME, JPEG_DATA_TENSOR_NAME,
RESIZED_INPUT_TENSOR_NAME]))
与从导入的图形检索jpeg_data_tensor
不同,您可以将其重新映射到您自己构造的输入管道中:
# Output of a training pipeline, returning a `tf.string` tensor containing
# a JPEG-encoded image.
jpeg_data_tensor = ...
bottleneck_tensor, resized_input_tensor = (
tf.import_graph_def(
graph_def,
input_map={JPEG_DATA_TENSOR_NAME: jpeg_data_tensor},
return_elements=[BOTTLENECK_TENSOR_NAME, RESIZED_INPUT_TENSOR_NAME]))
无论您以前在何处输入jpeg_data_tensor
,您都不再需要它,因为输入将从您构建的输入管道中读取。(请注意,您可能还需要处理resized_input_tensor
.我不太熟悉retrain.py
,所以可能需要进行一些重组。)
https://stackoverflow.com/questions/41938508
复制相似问题