[英]Tensorflow “map operation” for tensor?
我正在调整cifar10卷积示例到我的问题。 我想将设计中的数据输入从一个文件一次一个地读取到一个设计,该设计在一个已经在内存中的图像集上运行。 原始的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
是(某些东西, images_tensor.shape
)。
我的问题是非常,非常基本的:什么是应用一些功能(最好的办法tf.image.resize_image_with_crop_or_pad
在我的情况)来的所有元素images_tensor
?
迭代在张量流中是有问题的,具有有限的切片( TensorFlow - 类似于numpy的张量索引 )。 有没有一个解决方案只使用一个命令实现这一目标?
从版本0.8开始,有map_fn
。 从文档 :
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
。ARGS:
fn:要执行的可调用。
elems:要解压缩以应用
fn
张量。dtype :(可选)
fn
的输出类型。parallel_iterations :(可选)允许并行运行的迭代次数。 back_prop :(可选)True启用反向传播。 swap_memory :(可选)True启用GPU-CPU内存交换。 name :(可选)返回的张量的名称前缀。
返回:
一个张量,它将
fn
的结果打包到从elems
打开的张量包中,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]
```
有几个答案 - 没有一个像地图功能那样优雅。 哪个最好取决于你对内存效率的要求。
(a)您可以使用enqueue_many
将它们放入tf.FIFOQueue
,然后tf.image.resize_image_with_crop_or_pad
一个图像出列并tf.image.resize_image_with_crop_or_pad
在tf.FIFOQueue
,然后将其全部重新组合成一个大的smoosh。 这可能很慢。 需要N次调用才能运行N个图像。
(b)您可以使用单个占位符源并运行以从原始数据源调整大小并裁剪它们。 从内存的角度来看,这可能是最好的选择,因为您永远不必将未显示的数据存储在内存中。
(c)您可以使用tf.control_flow_ops.While
操作迭代整个批处理并在tf.Variable
构建结果。 特别是如果你利用while允许的并行执行,这可能是最快的方法。
我可能会选择(c)选项,除非你想减少内存使用,在这种情况下,在(选项b)的过程中过滤它将是一个更好的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.