基于输入管道的Tensorflow迁移学习

基于输入管道的Tensorflow迁移学习,tensorflow,deep-learning,Tensorflow,Deep Learning,我想用转移学习和谷歌的Inception网络来解决图像识别问题。我从TensorFlow示例源中获得灵感 在retain.py中,将加载初始图,并使用提要dict将新图像馈送到模型的输入层。但是,我在TFRecord文件中序列化了数据,并一直使用输入管道输入输入,如图所示 所以我有一个张量images,它在运行时批量返回我的输入数据。但是我怎样才能把这些图像输入到《盗梦空间》中呢?我不能使用feed dict,因为我的输入是张量,而不是NumPy数组。我的两个想法是 1) 只需在每个批上调用se

我想用转移学习和谷歌的Inception网络来解决图像识别问题。我从TensorFlow示例源中获得灵感

retain.py
中,将加载初始图,并使用提要dict将新图像馈送到模型的输入层。但是,我在TFRecord文件中序列化了数据,并一直使用输入管道输入输入,如图所示

所以我有一个张量
images
,它在运行时批量返回我的输入数据。但是我怎样才能把这些图像输入到《盗梦空间》中呢?我不能使用feed dict,因为我的输入是张量,而不是NumPy数组。我的两个想法是

1) 只需在每个批上调用
sess.run()
,将其转换为NumPy数组,然后使用提要dict将其传递给Inception

2) 用我自己的批输入张量替换Inception图中的输入节点

我认为(1)行得通,但似乎有点不雅。(2) 对我来说似乎更自然,但我不能完全做到这一点,因为TensorFlow图只能附加在后面,不能进行其他修改

有更好的方法吗?

您可以实现选项(2),替换输入节点,但您需要修改
retain.py
。该函数通过将导入图中的张量重新映射到目标图中的现有张量,支持对导入图进行有限形式的修改

调用
tf.import\u graph\u def()

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\u data\u 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\u data\u tensor
,您都不再需要它,因为输入将从您构建的输入管道中读取。(请注意,您可能还需要处理
resized\u input\u tensor
,我对
retain.py
不太熟悉,因此可能需要进行一些重构。)

谢谢,
import\u graph\u def
input\u map
参数正是我想要的。计算和缓存瓶颈现在比使用选项(1)快很多倍。