我正在调整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)。有没有一个解决方案只使用一个命令来实现这一目标?
答案 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
解压缩的张量构成。dtype
是fn
的返回值的数据类型。如果用户与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)