我想使用Google的Inception网络进行转移学习,以解决图像识别问题。我正在使用TensorFlow示例源中的retrain.py
来获取灵感。
在retrain.py
中,加载了初始图,并使用了一个Feed dict将新图像输入到模型的输入图层中。但是,我将数据序列化为TFRecord文件,并使用输入管道输入我的输入,如here所示。
所以我有一个张量images
,它在运行时批量返回我的输入数据。但是我如何将这些图像提供给Inception呢?我不能使用feed dict,因为我的输入是张量,而不是NumPy数组。我的两个想法是
1)只需在每个批次上调用sess.run()
将其转换为NumPy数组,然后使用feed dict将其传递给Inception。
2)用我自己的批输入张量
替换Inception图中的输入节点我认为(1)可行,但看起来有点不雅。 (2)对我来说似乎更自然,但我无法做到这一点,因为TensorFlow图只能附加到其他地方而不能被修改。
有更好的方法吗?
答案 0 :(得分:3)
您可以实现选项(2),替换输入节点,但您需要修改retrain.py
才能执行此操作。 tf.import_graph_def()
函数支持对导入图形进行有限形式的修改,方法是将导入图形中的重新映射张量到目标图形中的现有张量。
This line in retrain.py
调用tf.import_graph_def()
来导入Inception模型,其中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
...我对[{1}}并不熟悉,因此可能需要进行一些重组。)