tf.stack(
    values,
    axis=0,
    name='stack'
)
  • values:[N, B, D]
  • tf.stack(values, axis=1) = [B, N, D]
  • 与transpose有点等价,参考 https://blog.csdn.net/baidu_27643275/article/details/82465556
x = tf.constant([1, 4])
y = tf.constant([2, 5])
z = tf.constant([3, 6])
tf.stack([x, y, z])  # [[1, 4], [2, 5], [3, 6]] (Pack along first dim.)
tf.stack([x, y, z], axis=1)  # [[1, 2, 3], [4, 5, 6]]
理解:
    举例:当前两个个张量的维度均为:(维1,维2, 维3, 维4), 此时axis的取值范围为:[-5, 5)
    所以输入 stacks = [stack_data1, stack_data2], st = tf.stack(stacks, axis=?)
    此时:
          stacks的维度为:(2,维1,维2, 维3, 维4 )   维度为5,所以输出维度也为5, axis取值就在[-5, 5)
          当axis=0时, st维度为:(2, 维1, 维2, 维3, 维4)
          当axis=1时, st维度为:(维1, 2,维2, 维3, 维4)
          当axis=2时, st维度为:(维1, 维2, 2,维3, 维4)
          当axis=3时, st维度为:(维1, 维2, 维3,2,维4)
          当axis=4时, st维度为:(维1, 维2, 维3,维4,2)

          当axis=-5时, st维度为:(2, 维1, 维2, 维3, 维4)
          当axis=-4时, st维度为:(维1, 2,维2, 维3, 维4)
          当axis=-3时, st维度为:(维1, 维2, 2,维3, 维4)
          当axis=-2时, st维度为:(维1, 维2, 维3,2,维4)
          当axis=-1时, st维度为:(维1, 维2, 维3,维4,2)

pack

def pack(values, axis=0, name=None):
  r"""Packs a list of `N` rank-`R` tensors into one rank-`(R+1)` tensor.

  Packs the `N` tensors in `values` into a tensor with rank one higher than each
  tensor in `values`, by packing them along the `axis` dimension.
  Given a list of tensors of shape `(A, B, C)`;

  if `axis == 0` then the `output` tensor will have the shape `(N, A, B, C)`.
  if `axis == 1` then the `output` tensor will have the shape `(A, N, B, C)`.
  Etc.

  For example:

'x' is [1, 4]

'y' is [2, 5]

'z' is [3, 6]

pack([x, y, z]) => [[1, 4], [2, 5], [3, 6]] # Pack along first dim. pack([x, y, z], axis=1) => [[1, 2, 3], [4, 5, 6]]


This is the opposite of `unpack`.

Args:
  values: A list of at least 1 `Tensor` objects with the same type.
    Must be of same shape and type.
  axis: An optional `int`. Defaults to `0`.
    Dimension along which to pack.  Negative values wrap around, so the
    valid range is `[-(R+1), R+1)`.
  name: A name for the operation (optional).

Returns:
  A `Tensor`. Has the same type as `values`.
"""

tf.stack介绍

tf.stack 是 TensorFlow 中的一个函数,用于沿着一个新的维度将一组张量堆叠起来。这个函数可以接收一个张量列表,并且这些张量必须具有相同的形状。tf.stack 会创建一个新的维度,并在这个新维度上放置输入的张量。

基本语法如下:

tf.stack(values, axis=0, name='stack')
  • values: 这是一个包含相同形状张量的列表或元组。
  • axis: 这是指定新维度的位置,即张量将在哪个轴上被堆叠。默认值是 0,这意味着新的维度将是第一个维度。
  • name: 可选参数,为该操作指定名称。

举个例子,假设你有两个形状为 (2,) 的一维张量 ab,你可以使用 tf.stack 来将它们堆叠成一个二维张量:

import tensorflow as tf

# 创建两个形状为 (2,) 的张量
a = tf.constant([1, 2])
b = tf.constant([3, 4])

# 使用 tf.stack 沿着第一个维度(默认)堆叠
result = tf.stack([a, b])

print(result)

输出将会是:

<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[1, 2],
       [3, 4]], dtype=int32)>

这里,result 是一个形状为 (2, 2) 的张量,其中第一个维度表示原来的张量,第二个维度是原来张量中的元素。

如果你想要改变堆叠的方向,比如沿最后一个维度堆叠,你可以设置 axis 参数:

# 沿着最后一个维度(axis=1)堆叠
result = tf.stack([a, b], axis=1)

print(result)

这将产生一个形状为 (2, 2) 的张量,但这次堆叠方向不同:

<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[1, 3],
       [2, 4]], dtype=int32)>

在上面的例子中,每个张量 ab 的元素分别成为了结果张量的列。

参考

  • https://blog.csdn.net/feifeiyechuan/article/details/89388103