一、PyTorch简介与安装
1.核心概念
PyTorch 是一款 Python 深度学习框架,其核心是张量(Tensor) —— 元素为同一种数据类型的多维矩阵,以 “类” 的形式封装,内置了张量运算、处理等方法,是深度学习中数据存储和计算的基础单元。
2.安装命令
pip install torch===1.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
二、张量的创建与类型转换
1.基本创建方式
创建函数 | 功能描述 | 示例代码 | 输出结果 |
---|---|---|---|
torch.tensor() | 根据指定数据(标量、列表、NumPy 数组等)创建张量,自动匹配数据类型 | torch.tensor(10) torch.tensor([[10.,20.,30.],[40.,50.,60.]]) | tensor(10) tensor([[10.,20.,30.],[40.,50.,60.]]) |
torch.Tensor() | 1. 传入形状参数时,创建指定形状的未初始化张量(默认float32 )2. 传入列表时,创建包含指定元素的张量 | torch.Tensor(2,3) torch.Tensor([10,20]) | tensor([[0.0000e+00, 3.6893e+19, 2.2018e+05],[4.6577e-10, 2.4158e-12, 1.1625e+33]]) tensor([10.,20.]) |
torch.IntTensor()/FloatTensor()/DoubleTensor() | 创建指定数据类型的张量,支持形状参数或元素列表(元素会自动类型转换) | torch.IntTensor(2,3) torch.IntTensor([2.5,3.3]) | tensor([[0, 1610612736, 1213662609],[805308409, 156041223, 1]], dtype=torch.int32) tensor([2,3], dtype=torch.int32) |
2.线性与随机张量创建
线性张量
torch.arange(start,end,step):在(start,end)区间内按步长step
生成 1 维张量,元素类型为int64。示例:torch.arange(0,10,2)
→ tensor([0,2,4,6,8])
。
torch.linspace(start,end,step):在[start, end]
区间内生成steps
个等间隔元素的 1 维张量,默认float32
。示例:troch.linspace(0,11,10)-->tensor([0.00,1.22,...,11.00])。
随机张量与种子设置
torch.randn(shape):生成符合标准正态分布(均值 0、方差 1)的指定形状张量,默认float32
。示例:torch.randn(2,3)
→ 2 行 3 列的随机张量。
随机种子:torch.random.manual_seed(seed)
固定随机种子,确保每次运行生成相同的随机张量;torch.random.initial_seed()
查看当前随机种子。示例:
torch.random.manual_seed(100)
print(torch.randn(2,3)) # 每次运行结果一致
print(torch.random.initial_seed()) # 输出100
3.0-1及指定值张量创建
全1张量:torch.ones(shape)
创建指定形状全 1 张量;torch.ones_like(tensor)
根据已有张量形状创建全 1 张量,示例:
data = torch.ones(2,3) # tensor([[1.,1.,1.],[1.,1.,1.]])
data_like = torch.ones_like(data) # 与data形状相同的全1张量
全0张量:torch.zeros(shape)
创建指定形状全 0 张量;torch.zeros_like(tensor)
根据已有张量形状创建全 0 张量,用法与全 1 张量一致。
指定量张量:torch.full(shape, value)
创建指定形状、元素均为value
的张量;torch.full_like(tensor, value)
根据已有张量形状创建指定值张量,示例:
data = torch.full([2,3],10) # tensor([[10,10,10],[10,10,10]])
data_like = torch.full_like(data,20) # 元素均为20的张量
4.张量类型转换
data.type(torch.目标类型)显式指定目标类型,支持torch.ShortTensor
(int16)、torch.IntTensor
(int32)、torch.LongTensor
(int64)、torch.FloatTensor
(float32)、torch.DoubleTensor
(float64)。
data = torch.full([2,3],10) # dtype=torch.int64
data = data.type(torch.DoubleTensor) # dtype=torch.float64
data.目标类型缩写():快捷转换方法,如data.short()
(转 int16)、data.int()
(转 int32)、data.long()
(转 int64)、data.float()
(转 float32)、data.double()
(转 float64)。
data = torch.full([2,3],10) # dtype=torch.int64
data = data.double() # dtype=torch.float64
三、张量与其他数据类型的转换
1.张量转numpy数组
方法:data_tensor.numpy(),默认共享内存(修改一个,另一个同步变化);若需避免共享,使用data_tensor.numpy().copy()。
# 共享内存
data_tensor = torch.tensor([2,3,4])
data_numpy = data_tensor.numpy()
data_numpy[0] = 100 # data_tensor也变为tensor([100,3,4])# 不共享内存
data_numpy = data_tensor.numpy().copy()
data_numpy[0] = 200 # data_tensor仍为tensor([100,3,4])
2.numpy数组转张量
转换方法 | 内存共享情况 | 示例代码 | 输出结果 |
---|---|---|---|
torch.from_numpy(data_numpy) | 默认共享内存 | data_numpy = np.array([2,3,4]) data_tensor = torch.from_numpy(data_numpy) | tensor([2,3,4], dtype=torch.int32) (与 NumPy 数组类型匹配) |
torch.tensor(data_numpy) | 默认不共享内存 | data_tensor = torch.tensor(data_numpy) |
|
3.标量张量与数字转换
对于仅含一个元素的张量(标量张量),使用data.item()
提取 Python 原生数字类型(如int
、float
)。示例:
data1 = torch.tensor([30,]) # 标量张量
data2 = torch.tensor(30) # 标量张量
print(data1.item()) # 30(int类型)
print(data2.item()) # 30(int类型)
四、张量数值计算与运算函数
1.基本运算
支持加减乘除、取负等操作,分为不修改原张量和修改原张量(函数名带下划线)两类,示例:
data = torch.randint(0,10,[2,3]) # 示例:tensor([[3,7,4],[0,0,6]])# 不修改原张量
new_data = data.add(10) # 等价于data + 10 → tensor([[13,17,14],[10,10,16]])
new_data = data.sub(5) # 等价于data - 5
new_data = data.mul(2) # 等价于data * 2
new_data = data.div(2) # 等价于data / 2
new_data = data.neg() # 等价于-data# 修改原张量
data.add_(10) # data变为tensor([[13,17,14],[10,10,16]])
data.sub_(5) # data进一步修改
2.点乘与矩阵乘法
点乘(Hadamard积):两个同形状张量对应元素相乘,使用torch.mul(data1, data2)
或data1 * data2
。示例:
data1 = torch.tensor([[1,2],[3,4]])
data2 = torch.tensor([[5,6],[7,8]])
print(torch.mul(data1, data2)) # tensor([[5,12],[21,32]])
print(data1 * data2) # 同上
矩阵乘法:要求第一个张量的列数等于第二个张量的行数(形状为(n,m)
和(m,p)
,结果为(n,p)
),使用data1 @ data2
或torch.matmul(data1, data2)
。示例:
data1 = torch.tensor([[1,2],[3,4],[5,6]]) # (3,2)
data2 = torch.tensor([[5,6],[7,8]]) # (2,2)
print(data1 @ data2) # tensor([[19,22],[43,50],[67,78]])(3,2)
print(torch.matmul(data1, data2)) # 同上
3.常见运算函数
函数 | 功能描述 | 示例代码 | 输出结果(基于data = torch.tensor([[4.,0.,7.],[6.,3.,5.]], dtype=torch.float64) ) |
---|---|---|---|
data.mean(dim=None) | 计算均值,dim=0 按列算,dim=1 按行算 | data.mean() data.mean(dim=0) | tensor(4.1667, dtype=torch.float64) tensor([5.0000,1.5000,6.0000], dtype=torch.float64) |
data.sum(dim=None) | 计算总和,dim 参数用法同mean | data.sum() data.sum(dim=1) | tensor(25., dtype=torch.float64) tensor([11.,14.], dtype=torch.float64) |
torch.pow(data, n) | 计算元素的 n 次幂 | torch.pow(data,2) | tensor([[16.,0.,49.],[36.,9.,25.]], dtype=torch.float64) |
data.sqrt() | 计算元素的平方根 | data.sqrt() | tensor([[2.0000,0.0000,2.6458],[2.4495,1.7321,2.2361]], dtype=torch.float64) |
data.exp() | 计算元素的自然指数(e^x) | data.exp() | tensor([[5.4598e+01,1.0000e+00,1.0966e+03],[4.0343e+02,2.0086e+01,1.4841e+02]], dtype=torch.float64) |
data.log()/log2()/log10() | 分别计算自然对数、2 为底对数、10 为底对数 | data.log() data.log10() | tensor([[1.3863, -inf,1.9459],[1.7918,1.0986,1.6094]], dtype=torch.float64) tensor([[0.6021, -inf,0.8451],[0.7782,0.4771,0.6990]], dtype=torch.float64) |