默认执行代码 import tensor import numpy as np
1. 张量对象(Tensor)
1.1 创建张量的方法
- 根据指定数据创建张量
- torch.tensor
- torch.Tensor
- 根据形状创建张量
- torch.Tensor
- 创建指定类型的张量
- torch.IntTensor # int32
- torch.ShortTensor # int16
- torch.LongTensor # int64
- torch.FloatTensor # float32
- torch.DoubleTensor # float64
- 创建线性张量
- torch.arange # 指定步长
- torch.linspace # 指定数量
- 创建随机张量
- torch.randn(size) # 指定形状的随机张量
- torch.randint(start, end, size, dtype)
- 随机种子
- torch.random.init_seed() # 查看随机数种子
- torch.random.manual_seed(n: int) # 设置随机数种子
- 创建0-1张量
- 全为1张量
- torch.ones(size) # 创建指定形状全0张量
- torch.ones_like(Tensor) # 根据张量对象的形状创建全0张量
- 全为0张量
- torch.zeros
- torch.zeros_like
- 全为指定值张量
- torch.full(size, fill_value)
- torch.full_like(Tensor, fill_value)
1.2 张量中元素的数据类型
- 查看张量对象Tensor元素类型(dtype属性)
- Tensor.dtype 返回张量对象的元素类型
- 更改张量对象的元素类型(不能原地修改, 需要通过变量接收)
- 两种方法
- Tensor.type(torch.IntTensor)
- Tensor.int()
- 类型罗列
- 属性: IntTensor, LongTensor, ShortTensor, FloatTensor, DoubleTensor
- 方法: int(), long(), short(), float(), double()
1.3 张量对象的转换
- Tensor.numpy() # Tensor对象 ⇒ Ndarray对象
- 对象方法, 共享内存,可以使用 copy 函数(对Ndarray对象使用)避免共享
- torch.from_numpy(Ndarray) # Ndarray对象 ⇒ Tensor对象
- 类方法, 共享内存,可以使用 copy 函数(对Ndarray对象使用)避免共享
- torch.tensor(Ndarray) # Ndarray对象 ⇒ Tensor对象
- 类方法, 默认不共享内存
- Tensor.item() # Tensor对象 ⇒ 标量
- 对象方法, 张量中只有一个元素, 将其转化为变量.
1.4 张量计算
张量的计算包括张量间的运算和张量内部元素间的元算
1.4.1 张量间的运算
- 不修改原数据
- Tensor_1.add(Tensor_2) # 加
- Tensor_1.sub(Tensor_2) # 减
- Tensor_1.mul(Tensor_2) # (点)乘
- (n, m) * (n, m) ⇒ (n, m)
- Tensor_1.div(Tensor_2) # 除
- Tensor_1.neg(Tensor_2) # 取反
- Tensor_1.matmul(Tensor_2) # 矩阵乘法
- (n, m) @ (m, p) ⇒ (n, p)
- 修改原数据(同时返回修改后的对象)
- Tensor.add_(Tensor)
- … …
对于不修改原数据的张量对象间的运算加、减、(点)乘、除、矩阵乘法可以使用+ 、-、*、/ 、@来代替
1.4.2 张量中元素的运算
函数 | 说明 | ㅤ |
Tensor.mean() | 求平均 | ㅤ |
Tensor.sum() | 求和 | ㅤ |
torch.pow(Tensor, n) | 指数运算(Tensor对象各元素的n次方) | ㅤ |
Tensor.sqrt() | Tensor对象的平方根,等同torch.pow(Tensor, 0.5) | ㅤ |
Tensor.exp() | 指数计算, e的n次方(n为Tensor对象中元素值) | ㅤ |
Tensor.log()、Tensor.log2()、Tensor.log10() | 对数计算, 分别以e、2、10为底 | ㅤ |
… … | ㅤ | ㅤ |
1.5 张量索引
我们在操作张量时,经常需要去获取某些元素进行处理或者修改操作, 可以通过索引的方式实现, 返回的对象也依然是Tensor对象,同时,张量的索引操作和numpy中对于Ndarray数组的索引操作是完全一样的。包括行列索引、范围索引、布尔索引和多维索引
注:张量索引中的step必须大于0,否则报错
1.6 张量维度
1.6.1 张量维度查看(属性)
- Tensor.ndim
1.6.2 张量形状查看(属性、方法)
- Tensor.shape
- Tensor.size()
1.6.3 张量元素个数(方法)
- Tensor.numel()
1.6.4 张量降维、升维
- Tensor.squeeze([dim]) → new_Tensor 指定维度降维
- 参数缺省:将Tersor中所有为1的维度去除
- 指定参数dim:将Tersor中指定的dim维度为1的维度去除
- Tensor.unsqueeze(dim) → new_Tensor 升维
- 参数dim不能缺
- 将指定dim维度升维
1.6.5 张量形状变化
- Tensor.flatten() → new_Tensor 任意维度张量转化为一维张量
- Tensor.reshape(shape) → new_Tensor 改变形状
- Tensor.view(dtype: dtype) → new_Tensor 改变形状(内存不连续的张量不能使用此方法)
- torch.transpose(input:Tensor, dim0, dim1) 交换Tensor指定的两个维度(一次只能交换两个维度)
- Tensor.transpose()
- torch.permute(input: Tensor,dims: Size | list[int] | tuple[int, ...]) → new_Tensor 交换Tensor指定的多个维度
- Tensor.permute()对象方法
- Tensor.is_contiguous() → Bool 判定Tensor对象中元素的内存是否连续,是返回True,否则False
注:transpose和permute方法会将内存连续的张量对象更改为内存不连续的张量对象。但是形状变化前后两对象中访问的元素是地址共享的,解决内存共享问题,可以使用Tensor对象的clone方法来解决,相当于Numpy中copy方法。
1.6.7 张量拼接
- torch.cat(tensors: tuple[Tensor, ...] | list[Tensor], dim: int = 0)
2. 模型的基础使用
2.1 自动微分模块
训练神经网络时,最常用的算法就是反向传播。在该算法中,参数(模型权重)会根据损失函数关于对应参数的梯度进行调整。为了计算这些梯度,PyTorch内置了名为 torch.autograd 的微分引擎。它支持任意计算图的自动梯度计算:
接下来我们使用这个结构进行自动微分模块的介绍。我们使用backward 方法、grad 属性来实现梯度的计算和访问
2.2 线性回归案例
我们使用 PyTorch 的各个组件来构建线性回归的实现。在pytorch中进行模型构建的整个流程一般分为四个步骤:
- 准备训练集数据
- 构建要使用的模型
- 设置损失函数和优化器
- 模型训练