Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow“;地图操作“;对于张量?_Python_Functional Programming_Tensorflow - Fatal编程技术网

Python Tensorflow“;地图操作“;对于张量?

Python Tensorflow“;地图操作“;对于张量?,python,functional-programming,tensorflow,Python,Functional Programming,Tensorflow,我正在根据我的问题调整程序。我想将数据输入从一次从文件中读取一个图像的设计更改为一个在内存中的图像集上运行的设计。原始的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_i

我正在根据我的问题调整程序。我想将数据输入从一次从文件中读取一个图像的设计更改为一个在内存中的图像集上运行的设计。原始的
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\u input
是包含一个图像的张量

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

我的问题是非常基本的:将某些函数(
tf.image.resize\u image\u与\u crop\u或\u pad
在我的情况下)应用于
图像张量的所有元素的最佳方法是什么


在tensorflow中,迭代是有问题的,切片有限()。有没有一个解决方案可以只用一个命令就实现这一点?

有几个答案——没有一个比map函数更优雅。哪一个是最好的取决于你对内存效率的渴望

(a) 您可以使用
enqueue\u many
将它们放入一个队列中,然后退出队列并
tf.image。使用\u crop\u或\u pad一次调整\u image\u的大小,并将其全部重新压缩成一个大smoosh。这可能很慢。需要N个调用才能运行N个映像

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

(c) 您可以使用op迭代整个批处理,并在
tf.Variable
中建立结果。特别是如果您利用while允许的并行执行,这可能是最快的方法


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

从版本0.8开始,有
map\fn
。从:

map_fn(fn,elems,dtype=None,parallel_iterations=10,back_prop=True, 交换(内存=False,名称=None)

从维度0上的
元素
解包的张量列表上的映射

此映射运算符将可调用的
fn
重复应用于从头到尾的元素序列。这些元素由从
元素中解包的张量构成
dtype
fn
返回值的数据类型。如果数据类型与
元素的数据类型不同,则用户必须提供
dtype

假设
元素
被解包为
,一个张量列表。结果张量的形状为
[len(值)]+fn(值[0])。形状为

Args:

fn:要执行的可调用函数

元素:解包以应用
fn
的张量

数据类型:(可选)输出类型为
fn

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

返回:

fn
应用于张量列表的结果打包的张量 从
元素
从头到尾解包

提出:

类型错误:如果
fn
不可调用

例如:


Tensorflow提供了两个,其中一个是。用法非常简单:定义映射并将其应用于张量:

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

我在网上也找不到任何东西-上面(我已经完成了)的cam来自import tensorflow作为tf帮助(tf.map_fn),请确保您的版本是0.8或更高版本。
variable = tf.Variable(...)
mapping = lambda x: f(x)
res = tf.map_fn(mapping, variable)