【问题标题】:Tensorflow Transfer Learning with Input Pipeline带有输入管道的 TensorFlow 迁移学习
【发布时间】:2017-01-30 14:37:26
【问题描述】:

我想将迁移学习与 Google 的 Inception 网络结合使用来解决图像识别问题。我正在使用来自 TensorFlow 示例源的 retrain.py 来获取灵感。

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

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

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

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

我认为 (1) 会起作用,但它似乎有点不雅。 (2) 对我来说似乎更自然,但我不能完全做到这一点,因为 TensorFlow 图只能附加,不能以其他方式修改。

有更好的方法吗?

【问题讨论】:

    标签: tensorflow deep-learning


    【解决方案1】:

    您可以实现选项 (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...我对retrain.py 并不熟悉,因此可能需要进行一些重组。)

    【讨论】:

    • 谢谢,import_graph_definput_map 参数正是我想要的。计算和缓存瓶颈现在比选项 (1) 快很多倍。
    猜你喜欢
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2022-11-27
    • 2020-12-07
    相关资源
    最近更新 更多