写在前面

本文主要介绍了如下四个函数的参数意义及其函数用法,如有不恰当的地方,还请不吝指正!!!

  • tf.concat( )

  • tf.stack( )

  • tf.unstack( )

  • tf.split( )


写在中间

一、tf.concat( )函数

( 1 )简单介绍

tf.concat(values, axis)

  • values 是一个张量列表[tensor1, tensor2, tensor3, ...],表示需要连接的张量。

  • axis 是一个整数,可正可负,表示连接轴的方向。

( 2 )学会使用

分别定义两个二维,形状 shape = (2, 3) 的张量,使它们在第一个维度上面拼接,

  1. 将第一个维度的中括号打开:
    [ [1, 2, 3], [4, 5, 6] ] ——> [1, 2, 3], [4, 5, 6]
    [ [7, 8, 9], [10, 11, 12] ] ——> [7, 8, 9], [10, 11, 12]

  2. 合并后中括号还原:
    [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12] ——> [ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12] ]

import tensorflow as tf

tensor1 = tf.constant([[1, 2, 3], [4, 5, 6]]) 

tensor2 = tf.constant([[7, 8, 9], [10, 11, 12]])

tensor = tf.concat([tensor1, tensor2], 0)

print(tensor.shape) # (4, 3)

如果将上面的两个张量在第2个维度上面拼接,又该怎样做呢?

在第二个维度的拼接,不干扰第一个维度的张量,

  1. 将第二个维度的中括号打开:
    [ [1, 2, 3], [4, 5, 6] ] ——> [ 1, 2, 3, 4, 5, 6]
    [ [7, 8, 9], [10, 11, 12] ] ——> [ 7, 8, 9, 10, 11, 12]

  2. 将1, 2, 3与7, 8, 9对应,将4, 5, 6与10, 11, 12对应拼接,合并后中括号还原
    [ 1, 2, 3, 7, 8, 9], [ 4, 5, 6, 10, 11, 12] ——> [ [ 1, 2, 3, 7, 8, 9], [ 4, 5, 6, 10, 11, 12] ]


再举一个例子,还是这个三维的张量理解成【班级,学生,科目】,axis 分别对应0, 1, 2,或-3, -2, -1

import tensorflow as tf
# 收集4个班级35名学生的8个科目的成绩
tensor1 = tf.ones([4, 35, 8])
# 收集2个班级35名学生的8个科目的成绩
tensor2 = tf.ones([2, 35, 8])

# 在班级维度上拼接张量,
tensor = tf.concat([tensor1, tensor2], axis=0)
print(tensor.shape)  # 输出:(6, 35, 8)

理解方式和上面的方法相同,如果单看结果还是很简单的

此函数操作后不产生新的维度,下面的stack()函数就会产生新的维度


二、tf.stack( )函数

1 )简单介绍

tf.stack(values, axis=0,)

  • values: 是一个张量列表[tensor1, tensor2, tensor3, ...],表示需要连接的张量,它们将沿着新的维度堆叠在一起。这些张量应该有相同的形状。

  • axis: 一个整数,可正可负,表示沿哪个维度堆叠张量。

( 2 )代码示例

import tensorflow as tf
# 创建两个形状都为 [2, 3] 的张量
tensor1 = tf.constant([[1, 2, 3], [4, 5, 6]])
tensor2 = tf.constant([[7, 8, 9], [10, 11, 12]])
# 使用 tf.stack() 函数沿 axis = 0 将两个张量堆叠在一起
stacked_tensor = tf.stack([tensor1, tensor2], axis=0)
print(stacked_tensor)

# 输出
tf.Tensor(
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]], shape=(2, 2, 3), dtype=int32)


三、tf.unstack( )函数

tf.unstack(value, axis)

  • value: 一个多维 Tensor 张量。

  • axis: 一个整数,表示要将输入 Tensor 张量沿哪个轴(axis)进行分解。如果 axis 的值为负数,则从反向轴(倒数轴)开始分解。如果同时提供了 axisnum 参数,则优先使用 axis 参数。

( 2 )重点理解

tf.unstack 的作用是将输入的 Tensor 张量沿着指定的轴(axis)分解成多个 Tensor 张量。例如,如果输入的 Tensor 张量形状为 [2, 4, 35, 8],沿轴 8(第四维)进行分解,则会得到8个形状为 [2, 4, 35] 的 Tensor 张量。

import tensorflow as tf
tensor1 = tf.ones([4, 35, 8])
tensor = tf.unstack(tensor1, axis=2)
print(tensor[0].shape, tensor[3].shape, tensor[7].shape)
# 输出:(4, 35) (4, 35) (4, 35)

四、tf.split( )函数

tf.split(value, num_or_size_splits, axis)

  • value: 一个多维张量。

  • num_or_size_splits: 要拆分的张量数量或每个拆分的大小。可以是一个整数(表示拆分的数量)或一个一维张量(表示每个拆分的大小)。

  • axis: 一个整数,表示沿着哪个轴进行拆分。

  1. num_or_size_splits为数字的情况
import tensorflow as tf
tensor1 = tf.ones([2, 4, 35, 8])
# 拆分为2个形状为[2, 4, 35, 4]的张量
tensor = tf.split(tensor1, axis=3, num_or_size_splits=2)

print(tensor[0].shape, tensor[1].shape)  # 输出:[2, 4, 35, 4] [2, 4, 35, 4] 

  1. num_or_size_splits为一维向量的情况
import tensorflow as tf
tensor1 = tf.ones([2, 4, 35, 8])
# 在第三个轴上,按照2 / 2 / 4 形状拆分的张量
tensor = tf.split(tensor1, axis=3, num_or_size_splits=[2, 2, 4])

print(tensor[0].shape, tensor[1].shape, tensor[2].shape)
#  输出:(2, 4, 35, 2) (2, 4, 35, 2) (2, 4, 35, 4)

写在最后

07-02 07:43