我正在玩map_fn函数,并注意到它输出了一个TensorArray,这意味着它能够输出"锯齿状"张量(其中内部的张量具有不同的第一维度).
我尝试使用此代码查看此操作:
import tensorflow as tf
import numpy as np
NUM_ARRAYS = 1000
MAX_LENGTH = 1000
lengths = tf.placeholder(tf.int32)
tArray = tf.map_fn(lambda x: tf.random_normal((x,), 0, 1),
lengths,
dtype=tf.float32) # Should return a TensorArray.
# startTensor = tf.random_normal((tf.reduce_sum(lengths),), 0, 1)
# tArray = tf.TensorArray(tf.float32, NUM_ARRAYS)
# tArray = tArray.split(startTensor, lengths)
# outArray = tArray.concat()
with tf.Session() as sess:
outputArray, l = sess.run(
[tArray, lengths],
feed_dict={lengths: np.random.randint(MAX_LENGTH, size=NUM_ARRAYS)})
print outputArray.shape, l
Run Code Online (Sandbox Code Playgroud)
然而得到了错误:
"TensorArray具有不一致的形状.索引0具有形状:[259]但索引1具有形状:[773]"
这当然让我感到惊讶,因为我认为TensorArrays应该能够处理它.我错了吗?
虽然tf.map_fn()确实在内部使用tf.TensorArray对象,并且a 可以保存不同大小的对象,但是这个程序不会按原样工作,因为通过将元素堆叠在一起将其结果转换回a ,并且这个操作失败了.tf.TensorArraytf.map_fn()tf.TensorArraytf.Tensor
但是,您可以tf.TensorArray使用低杠杆tf.while_loop()操作来实现基于-based:
lengths = tf.placeholder(tf.int32)
num_elems = tf.shape(lengths)[0]
init_array = tf.TensorArray(tf.float32, size=num_elems)
def loop_body(i, ta):
return i + 1, ta.write(i, tf.random_normal((lengths[i],), 0, 1))
_, result_array = tf.while_loop(
lambda i, ta: i < num_elems, loop_body, [0, init_array])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2779 次 |
| 最近记录: |