2026深度学习入门必看!PyTorch张量(Tensor)全攻略:从创建到运算,一篇就够(附避坑指南)

12 阅读7分钟

大家好,我是你们的AI技术伙伴。👋

在深度学习的世界里,数据就是燃料,而Tensor(张量) 就是装载这些燃料的宇宙飞船。无论你是想做图像识别、自然语言处理,还是训练自己的大模型,绕不开的第一步就是掌握 PyTorch 中的 Tensor 操作。

今天,我将带你从零开始,深入剖析 Tensor 的创建、类型转换与运算,让你不仅知其然,更知其所以然。🚀


🧩 第一章:深度学习的“基石”——Tensor

在正式写代码之前,我们需要明确一个概念:什么是Tensor?

简单来说,Tensor 是一个多维数组,它是标量、向量、矩阵的高维扩展。

  • 0维 Tensor = 标量 (一个数)
  • 1维 Tensor = 向量 (一行数)
  • 2维 Tensor = 矩阵 (表格)
  • N维 Tensor = 深度学习的数据 (如:[批次, 通道, 高, 宽])

PyTorch 之所以强大,是因为它支持自动微分GPU加速。我们在处理 Tensor 时,实际上是在为后续的神经网络(如 CNN、RNN、Transformer)搭建地基。


🛠️ 第二章:5种姿势创建你的第一个Tensor

创建 Tensor 是入门的第一步。根据不同的场景,我们需要选择不同的创建方式。以下是基于实战总结的最全创建指南。

1. 基础创建法:torch.tensor()

这是最常用的方法,可以根据现有数据(列表、NumPy数组)直接创建。

import torch
import numpy as np

# 场景1: 从Python列表创建
data_list = [[1, 2, 3], [4, 5, 6]]
t1 = torch.tensor(data_list)
print(f"列表转Tensor: {t1}, 类型: {t1.dtype}") 

# 场景2: 从NumPy创建 (深度学习中非常常见)
np_data = np.random.randint(0, 10, size=(2, 3))
t2 = torch.tensor(np_data, dtype=torch.float32) # 指定类型
print(f"NumPy转Tensor: {t2}")

💡 避坑小贴士: torch.tensor() 会拷贝数据,如果你希望共享内存(节省空间),请使用 torch.from_numpy(),但要注意修改一方另一方也会变!

2. 指定形状创建:torch.Tensor() vs torch.tensor()

这里有一个新手极易混淆的点,请务必注意区分:

表格

函数行为默认类型备注
torch.Tensor()过时,但常用于按形状创建Float32传入数字(2,3)会创建2x3矩阵
torch.tensor()推荐,用于传入具体数据根据数据推断传入数字(2,3)会报错,需传列表
# 想要创建一个 2行3列 的矩阵,应该这样:
t_shape = torch.Tensor(2, 3) # 会生成随机值
# 或者更规范地:
t_zeros = torch.zeros(2, 3) # 全0矩阵

3. 创建特殊值张量:全0、全1、指定值

在初始化神经网络权重或构建Mask时,这些函数是神器。

# 全1矩阵 (常用于初始化)
t_ones = torch.ones(2, 3)

# 全0矩阵 (常用于占位)
t_zeros = torch.zeros(2, 3)

# 全为指定值的矩阵 (例如图像处理中的255填充)
t_full = torch.full(size=(2, 3), fill_value=255)

# 基于已有Tensor的形状创建 (非常灵活)
t_ref = torch.tensor([[1,2], [3,4]])
t_like = torch.ones_like(t_ref) # 创建一个和t_ref形状一样的全1矩阵
print(f"Like矩阵: {t_like}")

4. 线性与随机张量:模拟数据分布

深度学习需要大量数据,我们通常先用随机数或线性序列来测试代码逻辑。

  • 线性序列:适合做坐标轴或等差特征。
# arange: 左闭右开 [0, 10) 步长为2 -> 0, 2, 4, 6, 8
t_linear1 = torch.arange(0, 10, 2)

# linspace: 左闭右闭,不管步长,只要指定数量的点
t_linear2 = torch.linspace(0, 10, steps=5) # 从0到10,生成5个数

  • 随机张量重点来了! 为了保证实验的可复现性(Reproducibility),我们必须设置随机种子
# 设置随机种子 (科研/比赛必备,保证每次结果一样)
torch.manual_seed(42) 

# 均匀分布 (0, 1)之间
t_rand = torch.rand(2, 3)

# 正态分布 (标准正态)
t_normal = torch.randn(2, 3)

# 随机整数
t_int = torch.randint(low=1, high=10, size=(3, 3))

⚙️ 第三章:数据类型的“乾坤大挪移”

在深度学习中,数据类型(Dtype)极其重要。GPU计算通常要求 float32,而索引通常要求 long。搞错类型是导致程序崩溃的头号杀手。

1. 创建时指定类型

# 最佳实践:在创建时就指定好类型
t_float = torch.tensor([1.0, 2.0], dtype=torch.float32)
t_long = torch.tensor([1, 2], dtype=torch.long) # 分类任务标签常用

2. 运行时转换类型

如果已经创建好了 Tensor,想换类型怎么办?有两种主流写法:

t_src = torch.tensor([1.1, 2.2, 3.3])

# 方法一:通用的 type() 函数 (推荐,灵活)
t_int1 = t_src.type(torch.int32)

# 方法二:快捷函数 (语义清晰)
t_half = t_src.half()    # float16 (常用于混合精度训练)
t_float = t_src.float()  # float32
t_double = t_src.double() # float64

print(f"原数据: {t_src}, 转换后: {t_int1}")

🧮 第四章:张量运算与数学魔法

掌握了创建,接下来就是让数据“动”起来。PyTorch 的运算设计得非常像 NumPy,上手极快。

1. 基础四则运算

Tensor 支持直接使用 +-*/ 符号,也支持函数式调用。

a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])

# 加法
c1 = a + b
c2 = torch.add(a, b)

# 乘法 (注意区分点乘和矩阵乘)
d1 = a * b # 点乘 (Hadamard积),对应元素相乘

2. 矩阵乘法:深度学习的灵魂

这是新手最容易懵圈的地方。* 和 @ (或 matmul) 有天壤之别!

  • * (点乘) : 对应位置元素相乘。形状必须一致。
  • @ 或 torch.matmul() (矩阵乘) : 线性代数里的矩阵乘法。(n, m) @ (m, p) = (n, p)
# 矩阵乘法示例
A = torch.tensor([[1, 2], [3, 4]]) # 2x2
B = torch.tensor([[5, 6], [7, 8]]) # 2x2

# 结果是: [[1*5+2*7, 1*6+2*8], [3*5+4*7, 3*6+4*8]]
C = torch.matmul(A, B)
# 或者更简洁的:
C = A @ B
print(f"矩阵乘法结果:\n{C}")

3. 常用数学函数

在构建 Loss 函数或激活函数时,这些函数会频繁出现。

函数作用公式示例
torch.mean()求平均值(a+b)/2(a+b)/2
torch.sum()求和ΣΣ
torch.sqrt()开平方xx​
torch.pow(x, n)幂运算xnxn
torch.exp()指数运算exex
torch.log()自然对数ln(x)ln(x)

进阶技巧:维度操作 (dim)

t = torch.tensor([[1., 2., 3.], [4., 5., 6.]]) # 2行3列

# dim=0 代表“跨行”,即按列计算
print("按列求平均:", t.mean(dim=0)) # 结果: [2.5, 3.5, 4.5]

# dim=1 代表“跨列”,即按行计算
print("按行求和:", t.sum(dim=1)) # 结果: [6., 15.]

🔄 第五章:Tensor与NumPy的“爱恨情仇”

在深度学习流程中,我们经常需要在 PyTorch (Tensor) 和 Python 科学计算 (NumPy) 之间穿梭。

1. Tensor 转 NumPy

tensor_data = torch.tensor([1, 2, 3])
numpy_data = tensor_data.numpy() # 默认共享内存!

# 如果你打算修改 NumPy 数据且不想影响 Tensor,请加 copy()
numpy_data_copy = tensor_data.numpy().copy()

2. NumPy 转 Tensor

numpy_data = np.array([4, 5, 6])
tensor_data = torch.from_numpy(numpy_data) # 共享内存
# 或者
tensor_data2 = torch.tensor(numpy_data) # 拷贝数据,不共享

⚠️ 核心警告:共享内存机制
如果你使用了 torch.from_numpy() 或 .numpy(),它们指向的是同一块内存地址。
如果你在 GPU 上有一个 Tensor,你不能直接调用 .numpy()! 必须先 tensor.cpu() 拿回 CPU 才能转。


🚀 第六章:进阶技巧与性能优化

1. GPU 加速 (CUDA)

想让你的代码飞起来?把 Tensor 丢进显卡!

# 检查是否有 GPU
if torch.cuda.is_available():
    device = torch.device('cuda')
else:
    device = torch.device('cpu')

# 创建时直接指定设备
gpu_tensor = torch.tensor([1, 2, 3], device=device)
# 或者把已有的 Tensor 移动到 GPU
cpu_tensor = torch.tensor([4, 5, 6])
gpu_tensor2 = cpu_tensor.to(device)

2. 就地操作 (In-place Operation)

PyTorch 中以下划线 _ 结尾的函数(如 add_()mul_())会直接修改原 Tensor,不创建新对象。这在内存紧张时非常有用,但调试时要小心,因为它会覆盖原始数据。

x = torch.tensor(1)
x.add_(2) # x 现在变成了 3
print(x) # 输出 3

📝 结语

恭喜你读到这里!🎉

通过这篇文章,你已经掌握了 PyTorch 的核心——Tensor 的创建、类型管理、数学运算以及CPU/GPU切换。这不仅是深度学习的入门钥匙,也是你未来构建复杂模型(如 CNN、Transformer)的坚实地基。

记住: 看懂了不代表学会了,一定要动手敲代码! 哪怕只是改改数字,看看输出结果有什么不同。

如果你觉得这篇文章对你有帮助,别忘了点赞、收藏,并关注我,获取更多 AI 干货!有任何问题,欢迎在评论区留言,我们一起交流进步!💬