【问题标题】:Tensorflow "map operation" for tensor?张量的Tensorflow“地图操作”?
【发布时间】:2015-11-26 17:58:43
【问题描述】:

我正在调整cifar10 convolution example 来解决我的问题。我想将数据输入从从文件中一次读取一个图像的设计更改为对内存中的一组图像进行操作的设计。原来的inputs() 函数是这样的:

read_input = cifar10_input.read_cifar10(filename_queue)
reshaped_image = tf.cast(read_input.uint8image, tf.float32)
# Crop the central [height, width] of the image.
resized_image = tf.image.resize_image_with_crop_or_pad(reshaped_image,
                                                     width, height)

在原始版本中,read_input 是一个包含一个图像的张量。

我将所有图像都保存在 RAM 中,因此我没有使用 filename_queue,而是使用了一个巨大的 images_tensor = tf.constant(images),其中 images_tensor.shape 是(32、32、3)。

我的问题非常非常基本:将某些功能(在我的情况下为tf.image.resize_image_with_crop_or_pad)应用于images_tensor 的所有元素的最佳方法是什么?

在 tensorflow 中迭代是有问题的,切片有限 (TensorFlow - numpy-like tensor indexing)。是否有解决方案可以仅使用一个命令来实现这一目标?

【问题讨论】:

    标签: python functional-programming tensorflow


    【解决方案1】:

    从 0.8 版开始,有 map_fn。来自documentation

    map_fn(fn, elems, dtype=None, parallel_iterations=10, back_prop=True, swap_memory=False, name=None)

    在维度 0 上从 elems 解包的张量列表上映射。

    此映射运算符重复地将可调用的fn 应用于从第一个到最后一个元素的序列。元素由从elems 解包的张量组成。 dtypefn的返回值的数据类型。如果dtypeelems的数据类型不同,用户必须提供dtype

    假设elems 被解压成张量列表values。结果张量的形状为[len(values)] + fn(values[0]).shape

    参数:

    fn:要执行的调用。

    elems:要解包以应用 fn 的张量。

    dtype:(可选)fn的输出类型。

    parallel_iterations:(可选)允许运行的迭代次数 在平行下。 back_prop:(可选)True 启用反向传播。 swap_memory:(可选)True 启用 GPU-CPU 内存交换。 name:(可选)返回张量的名称前缀。

    返回:

    fn 应用于张量列表的结果打包的张量 从elems解包,从头到尾。

    加注:

    TypeError: if fn is not callable.

    例子:

      elems = [1, 2, 3, 4, 5, 6]
      squares = map_fn(lambda x: x * x, elems)
      # squares == [1, 4, 9, 16, 25, 36]
      ```
    

    【讨论】:

    • 我在网上也找不到任何东西——上面的(我已经完成了)cam from import tensorflow as tf help(tf.map_fn) 只要确保你的版本是 0.8 或更高版本.
    【解决方案2】:

    有几个答案 - 没有一个像 map 函数那样优雅。哪个最好取决于您对内存效率的渴望。

    (a) 您可以使用enqueue_many 将它们放入tf.FIFOQueue 中,然后一次出列和tf.image.resize_image_with_crop_or_pad 一个图像,然后将它们全部连接成一个大的smoosh。这可能很慢。需要 N 次调用才能运行 N 个图像。

    (b) 您可以使用单个占位符提要并运行以调整它们的大小并在它们从原始数据源进入的过程中对其进行裁剪。从内存的角度来看,这可能是最好的选择,因为您永远不必将未调整大小的数据存储在内存中。

    (c) 您可以使用tf.control_flow_ops.While 操作来遍历整个批次并将结果构建到tf.Variable 中。特别是如果您利用 while 允许的并行执行,这可能是最快的方法。

    除非您想尽量减少内存使用,否则我可能会选择选项 (c),在这种情况下,在 (选项 b) 中过滤它会是更好的选择。

    【讨论】:

      【解决方案3】:

      Tensorflow 提供了一对higher-order functions,其中一个是tf.map_fn。用法很简单:定义映射并将其应用于张量:

      variable = tf.Variable(...)
      mapping = lambda x: f(x)
      res = tf.map_fn(mapping, variable)
      

      【讨论】:

        猜你喜欢
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多