介绍
tensor 数组,动态长度
常跟while_loop或map_fn结合使用
语法
__init__(
dtype,
size=None,
dynamic_size=None,
clear_after_read=None,
tensor_array_name=None,
handle=None,
flow=None,
infer_shape=True,
element_shape=None,
colocate_with_first_write_call=True,
name=None
)
参数:
- dtype:(必需)TensorArray的数据类型。
- size:(可选)int32标量Tensor:TensorArray的大小。如果未提供 参数handle,则为必需。
- dynamic_size:(可选)如果为True,表示动态长度。默认值:False。
- clear_after_read:布尔值(可选,默认值:True)。如果为True,则在读取它们后清除TensorArray值。这将禁用多次读取语义,但允许及早释放内存。
- tensor_array_name:(可选)Python字符串:TensorArray的名称。在创建TensorArray手柄时使用。如果设置了该值,则句柄应为“无”。
- handle:(可选)Tensor现有TensorArray的句柄。如果已设置,则tensor_array_name应该为None。仅在图形模式下受支持。
- flow:(可选)Tensor来自现有的浮点标量 TensorArray.flow。仅在图形模式下受支持。
- infer_shape:(可选,默认:True)如果为True,则启用形状推断。在这种情况下,所有元素都必须具有 相同的形状。
- element_shape:(可选,默认值:无)一个TensorShape对象,指定TensorArray的每个元素的形状约束。不需要完全定义。
- colocate_with_first_write_call:如果True,则TensorArray将在同一设备上同一位置作为张量在其第一写入使用(写入操作包括write,unstack,和split)。如果为False,则TensorArray将放置在其初始化期间可用的设备上下文所确定的设备上。
常用方法
创建
a = tf.TensorArray(tf.float32,size=5)
print(a)
执行结果:
<tensorflow.python.ops.tensor_array_ops.TensorArray object at 0x7f3fcef255f8>
写入
write(
index,
value,
name=None
)
参数
- index:索引,写入的位置
- value:写入的值
例子
a = tf.TensorArray(tf.float32,size=5)
a.write(0,[0,1])
statck
将TensorArray中元素叠起来当做一个Tensor输出
stack(name=None)
例子(报错)
a = tf.TensorArray(tf.float32,size=5)
res=a.stack()
执行报错,因为没有元素:
ValueError: Cannot convert a partially known TensorShape to a Tensor: <unknown>
例子(正确)
a = tf.TensorArray(tf.float32,size=5)
a.write(0,[0,1])
a.write(1,[1,0])
a.write(2,[1,1])
res=a.stack()
执行结果:
tf.Tensor(
[[0. 1.]
[1. 0.]
[1. 1.]
[0. 0.]
[0. 0.]], shape=(5, 2), dtype=float32)
注意:
写入一个值后,其他位置的值形状与该值相同,但值为0
gather
根据索引将值 statck 连接
gather(
indices,
name=None
)
参数
- indices:索引
例子
a = tf.TensorArray(tf.float32,size=5)
a.write(0,[0,1])
a.write(1,[1,0])
a.write(2,[1,1])
res=a.gather([0,2])
a.close()
print(res)
执行结果:
tf.Tensor(
[[0. 1.]
[1. 1.]], shape=(2, 2), dtype=float32)
concat
将 TensorArray 里面的元素全部展开,串联在一起
concat(name=None)
例子
a = tf.TensorArray(tf.float32,size=5)
a.write(0,[0,1])
a.write(1,[1,0])
a.write(2,[1,1])
res=a.concat()
print(res)
执行结果:
tf.Tensor([0. 1. 1. 0. 1. 1. 0. 0. 0. 0.], shape=(10,), dtype=float32)
close
关闭 TensorArray,关闭后里面的值消失,一般在stack()、concat()后面调用
close(name=None)
例子
a = tf.TensorArray(tf.float32,size=5)
a.write(0,[0,1])
a.write(1,[1,0])
a.write(2,[1,1])
a.close()
res=a.stack()
print(res)
执行结果:
tf.Tensor([], shape=(0, 2), dtype=float32)
感谢:
https://blog.csdn.net/z2539329562/article/details/80639199