输入管道的张量流转移学习

时间:2017-01-30 14:37:26

标签: tensorflow deep-learning

我想使用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图只能附加到其他地方而不能被修改。

有更好的方法吗?

1 个答案:

答案 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}}并不熟悉,因此可能需要进行一些重组。)