遍历张量
python
tensorflow
6
0

我正在尝试以python方式处理可变大小的张量,如下所示:

# X is of shape [m, n]
for x in X:
    process(x)

我尝试使用tf.scan ,但事实是我想处理每个子张量,所以我尝试使用嵌套的scan ,但是启用了它,因为tf.scan与累加器一起工作,如果找不到,它将把elems的第一项作为初始化器,我不想这样做。举个例子,假设我想给张量的每个元素添加一个(这只是一个例子),并且我想逐个元素地对其进行处理。如果我运行下面的代码,我只会在子张量中添加一个,因为扫描会将第一个张量与每个子张量的第一个元素一起视为初始化器。

import numpy as np
import tensorflow as tf

batch_x = np.random.randint(0, 10, size=(5, 10))
x = tf.placeholder(tf.float32, shape=[None, 10])

def inner_loop(x_in):
    return tf.scan(lambda _, x_: x_ + 1, x_in)

outer_loop = tf.scan(lambda _, input_: inner_loop(input_), x, back_prop=True)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    rs = sess.run(outer_loop, feed_dict={x: batch_x})

有什么建议么 ?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

要遍历张量,您可以尝试tf.unstack

将等级R张量的给定尺寸解压缩为等级(R-1)张量。

因此,将每个张量加1看起来像:

import tensorflow as tf
x = tf.placeholder(tf.float32, shape=(None, 10))
x_unpacked = tf.unstack(x) # defaults to axis 0, returns a list of tensors

processed = [] # this will be the list of processed tensors
for t in x_unpacked:
    # do whatever
    result_tensor = t + 1
    processed.append(result_tensor)

output = tf.concat(processed, 0)

with tf.Session() as sess:
    print(sess.run([output], feed_dict={x: np.zeros((5, 10))}))

显然,您可以进一步从列表中解压缩每个张量以处理它,直到单个元素。但是,为了避免大量嵌套拆包,您可以尝试先用tf.reshape(x, [-1])平x,然后像这样循环遍历

flattened_unpacked = tf.unstack(tf.reshape(x, [-1])
for elem in flattened_unpacked:
    process(elem)

在这种情况下, elem是标量。

收藏
评论

大多数tensorflow内置函数都可以逐元素应用。因此,您可以将张量传递给函数。喜欢:

outer_loop = inner_loop(x)

但是,如果您有一些无法通过这种方式应用的功能(确实很容易看到该功能),则可以使用map_fn

假设您的函数只是将张量的每个元素加1(或其他任何值):

inputs = tf.placeholder...

def my_elementwise_func(x):
    return x + 1

def recursive_map(inputs):
   if tf.shape(inputs).ndims > 0:
       return tf.map_fn(recursive_map, inputs)
   else:
       return my_elementwise_func(inputs)

result = recursive_map(inputs)  
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号