tf.TensorArray(tensor动态数组)

介绍

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


原文出处:/show_1EF5HCYsMAdE.html