介绍
torch.zeros() 函数,这是创建全零张量最基础也最常用的函数,在初始化权重、构建掩码、占位符等场景中高频使用,我会从基础用法、参数细节到实战技巧帮你全面掌握。
作用
创建一个指定形状、所有元素值都为 0 的张量。是 PyTorch 中“创建固定值张量”的基础函数(同类还有 torch.ones() 创全1张量、torch.full() 创指定值张量),常用来初始化空张量或作为计算的初始值。
语法
torch.zeros(size, dtype=None, device=None, requires_grad=False)
参数:
| 参数 | 作用 | 常用场景 |
|---|---|---|
size |
张量的形状,可以是单个整数、多个整数,或元组/列表(如 (2,3)) |
核心参数,必传;torch.zeros((2,3)) 等价于 torch.zeros(2,3) |
dtype |
指定张量的数据类型(如 torch.float32/torch.int64) |
默认是 torch.float32(浮点型),需整数全零张量时手动指定 dtype=torch.int |
device |
指定张量存储的设备(cpu/cuda) |
深度学习中需和模型/数据同设备,如 device="cuda:0" |
requires_grad |
是否需要计算梯度(布尔值) | 仅初始化可训练参数时设为 True,普通占位符设为 False(默认) |
维度顺序:
torch.zeros(2,3) 是 2 行 3 列的二维张量,而非 3 行 2 列,需注意形状参数的顺序(先行后列);
例子
基础示例
先通过代码掌握核心用法,size 是唯一必传的核心参数:
import torch
# 示例1:创建一维全零张量(指定单个维度)
zeros_1d = torch.zeros(3)
print("一维全零张量:", zeros_1d) # tensor([0., 0., 0.])
print("形状:", zeros_1d.shape) # torch.Size([3])
# 示例2:创建二维全零张量(指定多个维度,常用矩阵场景)
zeros_2d = torch.zeros(2, 3)
print("二维全零张量:\n", zeros_2d)
# 输出:
# tensor([[0., 0., 0.],
# [0., 0., 0.]])
print("形状:", zeros_2d.shape) # torch.Size([2, 3])
# 示例3:创建高维全零张量(批量矩阵场景)
zeros_3d = torch.zeros(4, 2, 3) # 4个 2×3 的全零矩阵
print("三维全零张量形状:", zeros_3d.shape) # torch.Size([4, 2, 3])
进阶参数示例
# 示例1:指定数据类型(整数全零张量)
zeros_int = torch.zeros(2, 3, dtype=torch.int64)
print("整数全零张量:\n", zeros_int)
# 输出:
# tensor([[0, 0, 0],
# [0, 0, 0]])
print("数据类型:", zeros_int.dtype) # torch.int64
# 示例2:指定设备(GPU张量,需有CUDA环境)
if torch.cuda.is_available():
zeros_cuda = torch.zeros(2, 3, device="cuda")
print("GPU张量设备:", zeros_cuda.device) # cuda:0
else:
print("无CUDA环境,默认创建CPU张量")
# 示例3:可求梯度的全零张量(初始化可训练参数)
zeros_grad = torch.zeros(2, 3, requires_grad=True)
print("是否可求梯度:", zeros_grad.requires_grad) # True
应用场景
(1)初始化模型参数
在自定义模型时,常用来初始化偏置(bias)等参数:
# 模拟:初始化一个线性层的偏置
bias = torch.zeros(10, requires_grad=True) # 10个输出维度的偏置,可求梯度
print("偏置参数:", bias) # tensor([0., 0., ..., 0.], requires_grad=True)
(2)创建掩码/占位符
在数据处理中,常用来创建空张量存储结果,避免频繁创建新张量:
# 模拟:批量处理数据,先创建全零占位符
batch_size = 4
feature_dim = 5
output = torch.zeros(batch_size, feature_dim) # 占位符
# 填充数据(模拟批量计算)
for i in range(batch_size):
output[i] = torch.randn(feature_dim) # 用随机数填充每一行
print("填充后的张量:\n", output)
(3)与其他函数结合(zeros_like)
如果想创建和已有张量形状/类型/设备完全一致的全零张量,优先用 torch.zeros_like(),更简洁:
x = torch.tensor([[1.5, 2.3], [3.1, 4.2]], device="cpu", dtype=torch.float32)
# 创建和x相同属性的全零张量
zeros_like_x = torch.zeros_like(x)
print("zeros_like结果:\n", zeros_like_x)
print("形状一致:", zeros_like_x.shape == x.shape) # True
print("设备一致:", zeros_like_x.device == x.device) # True
常见易错点
- 数据类型隐式转换:全零浮点张量(默认)和整数张量运算时,会自动转为浮点型,需注意类型匹配;
- 设备不匹配:如果模型在 GPU 上,而
torch.zeros()默认创建 CPU 张量,直接运算会报错,需指定device参数。
总结
torch.zeros()是创建指定形状全零张量的核心函数,默认创建float32类型的 CPU 张量。- 关键参数:
size定义形状,dtype指定数据类型,device指定存储设备,requires_grad控制是否可求梯度。 - 实战技巧:需和已有张量属性一致时,优先用
torch.zeros_like();初始化可训练参数时记得设requires_grad=True。