Tensorflow“地图操作”为张量?

时间:2015-11-26 17:58:44

标签: python functional-programming tensorflow

我正在调整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)。有没有一个解决方案只使用一个命令来实现这一目标?

3 个答案:

答案 0 :(得分:11)

从版本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的返回值的数据类型。如果用户与dtype的数据类型不同,则必须提供elems

     

假设将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:如果fn不可调用。

     

示例:

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

答案 1 :(得分:9)

有几个答案 - 没有一个像地图功能那样优雅。哪个最好取决于你对内存效率的渴望。

(a)您可以使用public Grafico g = new Grafico("Grafico"); public void verGrafico(){ g.atualizaDataset(qtdHumanos, qtdZumbis, nroJogada); g.pack(); g.setVisible(true); g.repaint(); } 将它们投入tf.FIFOQueue,然后一次出列并enqueue_many一张图像,并将其全部重新组合成一个大的阴影。这可能很慢。需要N次调用才能运行N个图像。

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

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

我可能会选择(c)选项,除非你想减少内存使用,在这种情况下,在(选项b)的过程中过滤它将是一个更好的选择。

答案 2 :(得分:2)

Tensorflow提供了几个higher-order functions,其中一个是tf.map_fn。用法非常简单:您可以定义mappping并将其应用于张量:

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