张量的 Tensorflow "map operation"?

Tensorflow "map operation" for tensor?

我正在调整 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 - numpy-like tensor indexing)。是否有仅使用一个命令即可实现此目的的解决方案?

有几个答案 - none 与地图函数一样优雅。哪个最好取决于您对内存效率的要求。

(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)中过滤它会是更好的选择。

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

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

map on the list of tensors unpacked from elems on dimension 0.

This map operator repeatedly applies the callable fn to a sequence of elements from first to last. The elements are made of the tensors unpacked from elems. dtype is the data type of the return value of fn. Users must provide dtype if it is different from the data type of elems.

Suppose that elems is unpacked into values, a list of tensors. The shape of the result tensor is [len(values)] + fn(values[0]).shape.

Args:

fn: The callable to be performed.

elems: A tensor to be unpacked to apply fn.

dtype: (optional) The output type of fn.

parallel_iterations: (optional) The number of iterations allowed to run in parallel. back_prop: (optional) True enables back propagation. swap_memory: (optional) True enables GPU-CPU memory swapping. name: (optional) Name prefix for the returned tensors.

Returns:

A tensor that packs the results of applying fn to the list of tensors unpacked from elems, from first to last.

Raises:

TypeError: if fn is not callable.

Example:

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

Tensorflow 提供了两个 higher-order functions and one of them is tf.map_fn。使用非常简单:定义映射并将其应用于张量:

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