TensorFlow 2.0 | Tensor的维度变换整理

 

目录

1. 张量变形(reshape)

2. 维度增减

2.1 维度增加(expand_dims)

2.2 维度删除(squeeze)

3. 维度交换(transpose)

4. 张量合并

4.1 张量拼接(concat)

4.2 张量堆叠(stack)

5. 张量分割(split)


神经网络搭建过程中,维度变换是最重要的操作之一,通过切换数据形式,从而满足不同场景的运算需求。本文对所有维度处理的方式进行了整理。

1. 张量变形(reshape)

在总数据量不变的情况下,将其变换为不同的组合形式,且将此数据平铺时排列顺序不改变

举个例子:

>>> import tensorflow as tf
>>> x = tf.range(24)	# 生成一组连续整数向量
>>> x = tf.reshape(x, [2, 3, 4])	# 改变x的视图,得到3D张量
>>> x
<tf.Tensor: id=11, shape=(2, 3, 4), dtype=int32, numpy=
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])>
>>> y = tf.reshape(x, [3, 2, 2, 2])    # 将x变形为4D张量
>>> y
<tf.Tensor: id=13, shape=(3, 2, 2, 2), dtype=int32, numpy=
array([[[[ 0,  1],
         [ 2,  3]],

        [[ 4,  5],
         [ 6,  7]]],


       [[[ 8,  9],
         [10, 11]],

        [[12, 13],
         [14, 15]]],


       [[[16, 17],
         [18, 19]],

        [[20, 21],
         [22, 23]]]])>

数据在创建时按着初始的维度顺序写入,改变张量的视图仅仅是改变了张量的理解方式,并不需要改变张量的存储顺序,张量只需要满足新视图的元素总量与存储区域大小相等即可

像上面:2∗3∗4=3∗2∗2∗22*3*4 = 3*2*2*22∗3∗4=3∗2∗2∗2,总量没变;且张量的存储顺序始终没有改变,数据仍是按照0,1,2,...,230,1,2,...,230,1,2,...,23的顺序保存

 

2. 维度增减

2.1 维度增加(expand_dims)

增加一个长度为 1 的维度相当于给原有的数据添加一个新维度的概念,因为维度长度为 1,所以数据并没有改变

举个例子:

>>> x = tf.random.normal([5, 5])	# 建立正态随机数据
>>> x
<tf.Tensor: id=19, shape=(5, 5), dtype=float32, 
### TensorFlow 张量的概念 TensorFlow中的张量(Tensor)是一个多维数组,类似于NumPy中的ndarray。它用于表示数据流图中的所有中间值和最终结果[^3]。张量的维度由其形状(shape)定义,例如一维张量可以看作向量,二维张量则为矩阵。 #### 创建张量的方法 可以通过多种方式创建张量: 1. **从Python列表或NumPy数组创建** 使用`tf.constant()`函数可以从Python列表或NumPy数组创建常量张量。 ```python import tensorflow as tf # 从Python列表创建张量 tensor_from_list = tf.constant([[1, 2], [3, 4]]) # 从NumPy数组创建张量 import numpy as np numpy_array = np.array([[5, 6], [7, 8]]) tensor_from_numpy = tf.constant(numpy_array) ``` 2. **随机生成张量** 可以通过`tf.random.uniform()`或其他随机方法生成指定范围内的张量。 ```python random_tensor = tf.random.uniform(shape=(3, 3), minval=0, maxval=10) ``` 3. **使用变量创建可训练张量** 如果需要一个可以在模型训练过程中更新的张量,则应使用`tf.Variable`类。 ```python variable_tensor = tf.Variable(initial_value=[[1.0, 2.0], [3.0, 4.0]], dtype=tf.float32) ``` #### 基本操作 ##### 转置张量 转置操作会交换张量的行列位置。对于二维张量而言,这意味着将其行变为列,反之亦然。 ```python import tensorflow as tf # 定义一个(3, 3)的张量 tensor2d_tf = tf.random.uniform((3, 3)) transposed_tensor_tf = tf.transpose(tensor2d_tf) print("原始张量:\n", tensor2d_tf.numpy()) print("转置后的张量:\n", transposed_tensor_tf.numpy()) ``` ##### 类型转换 有时需要将张量的数据类型从一种形式转换为另一种形式,比如从浮点数转换为整数。 ```python float_tensor = tf.constant([1.1, 2.2, 3.3]) int_tensor = tf.cast(float_tensor, dtype=tf.int32) ``` ##### 计算梯度 TensorFlow支持自动微分功能,这对于构建机器学习模型尤为重要。通过`GradientTape`上下文管理器记录运算过程并计算导数。 ```python with tf.GradientTape() as tape: x = tf.Variable(3.0) y = x**2 grad_of_y_wrt_x = tape.gradient(y, x) print(grad_of_y_wrt_x) # 输出应该是6.0 ``` ### 总结 TensorFlow中的张量是核心概念之一,提供了丰富的API来进行各种数值处理和科学计算任务。无论是简单的数学变换还是复杂的神经网络建模,都离不开对张量的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值