PyTorch 学习
张量基础操作
张量创建
基本张量创建
- torch.tensor(data)创建指定内容的张量
- torch.Tensor(size)创建指定形状的张量
- 创建指定类型的张量
- 可通过 torch.IntTensor()、torch.FloatTensor()等创建
- 或在 torch.tensor()中通过 dtype 参数指定类型
指定区间的张量创建
- torch.arange(start, end, step)在区间内按步长创建张量
- torch.linspace(start, end, steps)在区间内按元素数量创建张量
- torch.logspace(start, end, steps, base)在指数区间内按指定底数创建张量
按数值填充张量
- torch.zeros(size)创建指定形状的全 0 张量
- torch.ones(size)创建指定形状的全 1 张量
- torch.full(size,value)创建指定形状的按指定值填充的张量
- torch.empty(size)创建指定形状的未初始化的张量
- torch.zeros_like(input)创建与给定张量形状相同的全 0 张量
- torch.ones_like(input)创建与给定张量形状相同的全 1 张量
- torch.full_like(input,value)创建与给定张量形状相同的按指定值填充的张量
- torch.empty_like(input)创建与给定张量形状相同的未初始化的张量
- torch.eye(n, [m])创建单位矩阵
随机张量创建
- torch.rand(size)创建在[0,1)上均匀分布的,指定形状的张量
- torch.randint(low, high, size)创建在[low,high)上均匀分布的,指定形状的 张量
- torch.randn(size)创建标准正态分布的,指定形状的张量
- torch.normal(mean,std,size)创建自定义正态分布的,指定形状的张量
- torch.rand_like(input)创建在[0,1)上均匀分布的,与给定张量形状相同的张量
- torch.randint_like(input, low, high)创建在[low,high)上均匀分布的,与给 定张量形状相同的张量
- torch.randn_like(input)创建标准正态分布的,与给定张量形状相同的张量
- torch.randperm(n)生成从 0 到 n-1 的随机排列,类似洗牌
- torch.random.initial_seed()查看随机数种子
- torch.manual_seed(seed)设置随机数种子
张量转换
张量元素类型转换
- Tensor.type(dtype)修改张量的类型
- Tensor.double()等修改张量的类型
Tensor 与 ndarray 转换
- Tensor.numpy()将 Tensor 转换为 ndarray,共享内存。使用 copy()避免共享内存
- Tensor.from_numpy(ndarray)将 ndarray 转换为 Tensor,共享内存。使用 copy()避免 共享内存
- torch.tensor(ndarray)将 ndarray 转换为 Tensor,不共享内存
Tensor 与标量转换
若张量中只有 1 个元素,Tensor.item()可提取张量中元素为标量。
张量数值计算
基本运算
四则运算
- +、-、*、/加减乘除
- add()、sub()、mul()、div()加减乘除,不改变原数据
- add_()、sub_()、mul_()、div_()加减乘除、修改原数据
-、neg()、neg_()取负
**、pow()、pow_()求幂
sqrt()、sqrt_()求平方根
exp()、exp_()以 e 为底数求幂
log()、log_()以 e 为底求对数
哈达玛积(元素级乘法)
- 两个矩阵对应位置元素相乘称为哈达玛积(Hadamard product)。 使用*、mul()实现两个形状相同的张量之间对位相乘。
矩阵乘法运算
- mm()严格用于二维矩阵相乘
- @、matmul()支持多维张量,按最后两个维度做矩阵乘法,其他维度广播
节省内存
运行一些操作时可能导致为新的结果分配内存,例如 X=X@Y,发现 id(X)会指向另一个 位置,这是因为 Python 首先计算 X@Y,为结果分配新的内存,再令 X 指向内存中的新位 置。
- 如果后续 X 不再重复使用,可以使用 X[:] = X @ Y 来减少内存开销
张量运算函数
- sum()求和
- mean()求均值
- max()/min()求最大/最小值及其索引
- argmax()/argmin()求最大值/最小值的索引
- std()求标准差
- unique()去重
- sort()排序
张量索引操作
简单索引
1 | |
列表索引
1 | |
范围索引
1 | |
布尔索引
1 | |
张量形状操作
交换维度
- transpose()交换两个维度
- permute()重新排列多个维度
调整形状
- reshape()调整张量的形状
- view()调整张量的形状,需要内存连续。共享内存
- is_contiguous()判断是否内存连续
- contiguous()转换为内存连续
增加或删除维度
- unsqueeze()在指定维度上增加 1 个维度
- squeeze()删除大小为 1 的维度
张量拼接操作
- torch.cat()张量拼接,按已有维度拼接。除拼接维度外,其他维度大小须相同
- torch.stack()张量堆叠,按新维度堆叠。所有张量形状必须一致
自动微分模块
PyTorch 具有一个内置的微分引擎 torch.autograd 以支持计算图的梯度自动计算

该计算图中 x、w、b 为叶子节点,即最基础的节点。叶子节点的数据并非由计算生成, 因此是整个计算图的基石,叶子节点张量不可以执行 in-place 操作。而最终的 loss 为根节点
可通过 is_leaf 属性查看张量是否为叶子节点
自动微分的关键就是记录节点的数据与运算。数据记录在张量的 data 属性中,计算记 录在张量的 grad_fn 属性中
计算图根据搭建方式可分为静态图和动态图,PyTorch 是动态图机制,在计算的过程中 逐步搭建计算图,同时对每个 Tensor 都存储 grad_fn 供自动微分使用。当计算到根节点后, 在根节点调用 backward()方法即可反向传播计算计算图中所有节点的梯度。
非叶子节点的梯度在反向传播之后会被释放掉(除非设置参数 retain_grad=True)。而 叶子节点的梯度在反向传播之后会保留(累积)。通常需要使用 optimizer.zero_grad()清零参数的梯度。
若设置张量参数 requires_grad=True,则 PyTorch 会追踪所有基于该张量的操作,并在反向传播时计算其梯度。依赖于叶子节点的节点,requires_grad 默认为 True。
有时我们希望将某些计算移动到计算图之外,可以使用 Tensor.detach()返回一个新的变量,该变量与原变量具有相同的值,但丢失计算图中如何计算原变量的信息。换句话说,梯度不会在该变量处继续向下传播。
线性回归案例
1 | |
参数初始化和正则化
常数初始化
1 | |
注意:将权重初始值设为 0 将无法正确进行学习。严格地说,不能将权重初始值设成一 样的值。因为这意味着反向传播时权重全部都会进行相同的更新,被更新为相同的值(对称 的值)。这使得神经网络拥有许多不同的权重的意义丧失了。为了防止“权重均一化”(瓦 解权重的对称结构),必须随机生成初始值。
秩初始化
权重参数初始化为单位矩阵。
1 | |
正态分布初始化
权重参数按指定均值与标准差正态分布初始化。
1 | |
均匀分布初始化
权重参数在指定区间内均匀分布初始化。
1 | |
Xavier 初始化(也叫 Glorot 初始化)

1 | |
He 初始化(也叫 Kaiming 初始化)

1 | |
| 特性 | Xavier 初始化 | He 初始化 |
|---|---|---|
| 提出者 | Xavier Glorot | Kaiming He(何凯明) |
| 适用激活函数 | Sigmoid、Tanh(对称、有界) | ReLU、LeakyReLU(非对称、有稀疏性) |
| 核心目标 | 保持输入输出方差一致(前向 + 反向传播稳定) | 针对 ReLU 的“一半神经元关闭”特性,调整方差 |
| 方差计算依据 | fan_in + fan_out |
fan_in(通常) |
| 分布形式 | 均匀分布 或 正态分布 | 均匀分布 或 正态分布 |
| 典型使用场景 | 全连接网络 + Tanh/Sigmoid | CNN / 深层网络 + ReLU |
根本原因就是:
神经网络的训练依赖于梯度的稳定传播,而权重的初始值会直接影响梯度的大小与方向!如果初始值不合适,就会出现梯度消失或爆炸,导致模型根本学不动。
Xavier 初始化(Glorot)和 He 初始化(何凯明)是两种常用的神经网络权重初始化方法,它们的核心区别在于:Xavier 适用于 Sigmoid/Tanh 等对称激活函数,通过保持输入输出方差一致来避免梯度问题;而 He 初始化针对 ReLU 及其变种,调整了方差计算方式以适应其稀疏激活特性。它们的出现都是为了解决深度神经网络中因权重初始化不当导致的梯度消失或爆炸问题,是训练稳定、高效神经网络的关键技术。
Dropout 随机失活
Dropout(随机失活,暂退法)是一种在学习的过程中随机关闭神经元的方法。
可以通过 torch.nn.Dropout(p)来使用 Dropout,并通过参数 p 来设置失活概率。
1 | |
应用案例:房价预测
1 | |