1 生成张量
1.1 使用torch.tensor()或者torch.Tensor()来生成张量。
两者主要区别为
torch.Tensor(data)
:直接调用Tensor
构造函数会默认创建一个浮点型张量 (torch.float32
)。即使输入的数据是整数列表或元组,生成的张量元素也会被转换为浮点数。torch.tensor(data)
:此函数会根据输入数据的类型推断出张量的类型。如果输入的是整数列表,则生成的张量将具有整数类型(例如torch.int64
),而浮点数列表则会生成浮点类型的张量。
1 | import torch |
1.2 一些基本的张量
函数 | 描述 |
---|---|
torch.zeros(3, 3) |
创建一个形状为 (3, 3) 的全零张量。所有元素都初始化为 0。 |
torch.ones(3, 3) |
创建一个形状为 (3, 3) 的全一张量。所有元素都初始化为 1。 |
torch.eye(3, 3) |
创建一个形状为 (3, 3) 的单位矩阵(对角线元素为1,其余元素为0)。 |
torch.rand(3, 3) |
创建一个形状为 (3, 3) 的张量,元素是从均匀分布 $ \text{Uniform}(0, 1) $ 中抽取的随机数,值在 [0, 1) 区间内等概率出现。 |
torch.randn(3, 3) |
创建一个形状为 (3, 3) 的张量,元素是从标准正态分布 $ \mathcal{N}(0, 1) $ 中抽取的随机数,均值为 0,方差为 1。 |
torch.empty(3, 4) |
创建一个形状为 (3, 4) 的未初始化张量。它不会将内存设置为任何特定值,因此创建速度较快,但内容是未定义的。 |
torch.rand_like(h, dtype=torch.float) |
创建一个与现有张量 h 大小相同的新张量,元素是从均匀分布 $ \text{Uniform}(0, 1) $ 中抽取的随机数,并指定数据类型为 float 。 |
1 | a = torch.rand(3,4) |
2 一些简单函数
2.1 基本函数
函数 | 作用 |
---|---|
A.dim() |
获取A的维度 |
A.item() |
将Tensor转化为基本数据类型,注意Tensor中只有一个元素的时候才可以使用,一般用于在Tensor中取出数值 |
A.numpy() |
将Tensor转化为Numpy类型 |
A.size() |
查看尺寸 |
A.shape |
查看尺寸 |
A.dtype |
查看A中元素的类型(张量中的所有元素都具有相同的类型) |
A.view() |
重构张量尺寸,类似于Numpy中的reshape |
A.transpose(0, 1) |
行列交换 |
A[1:], A[-1, -1]=100 |
切片操作,类似Numpy中的切片 |
A.zero_() |
归零化 |
torch.stack((A, B), dim=-1) |
拼接,升维 |
torch.diag(A) |
取A对角线元素形成一个一维向量 |
torch.diag_embed(A) |
将一维向量放到对角线中,其余数值为0的Tensor |
1 | v = torch.tensor([2.3, 4.2, 3]) |
2.2 基本运算
y = x + y 系统将取消引⽤ y 的地址,指向新地址。y指向地址不同。
y[:] = x + y 和 y += x 系统不再分配新空间,y指向的地址相同
函数 | 作用 |
---|---|
torch.abs(A) |
计算绝对值 |
torch.add(A, B) |
相加,A和B既可以是Tensor也可以是标量 |
torch.clamp(A, min, max) |
裁剪,A中的数据若小于min或大于max,则变成min或max,即保证范围在[min, max] |
torch.div(A, B) |
相除,A / B,A和B既可以是Tensor也可以是标量 |
torch.mul(A, B) |
点乘,A * B,A和B既可以是Tensor也可以是标量 |
torch.pow(A, n) |
求幂,A的n次方 |
torch.mm(A, B.T) |
矩阵叉乘,注意与torch.mul 之间的区别 |
torch.mv(A, B) |
矩阵与向量相乘,A是矩阵,B是向量,这里的B需不需要转置都是可以的 |
3. cuda相关用法
1 | # 测试GPU环境是否可使用 |
4. 梯度
4.1 求导
- 对于非标量的输出 y,比如形状为 (N,) 的向量,并且你想要计算输入 x 对应的梯度,那么你需要指定一个形状与 y 相同的权重张量 gradient。这个权重张量代表了每个输出元素对最终目标(通常是损失函数)的贡献。
- retain_graph=True:用于在调用 backward() 后保持计算图不被释放,以便可以对同一前向传播的结果进行多次反向传播。
- create_graph=True:用于在计算梯度时保留更高阶的梯度信息,使得可以计算二阶或更高阶导数。
1 | # 标量Tensor求导 |
1 | # 非标量Tensor求导 |
1 | #单个自变量求导 |
1 | # 多个自变量求偏导 |
1 | #例2-1-3 利用自动微分和优化器求最小值 |
5 Dataset and DataLoader
DataLoader
是 PyTorch 中用于加载数据集并提供迭代器接口的类。以下是 DataLoader
的各个参数及其说明:
1 | DataLoader( |
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
dataset |
Dataset | 必填项 | 数据集对象,决定数据从哪里读取以及如何读取。必须实现 __len__ 和 __getitem__ 方法。 |
batch_size |
int | 1 | 每个批次(batch)的数据量大小。 |
shuffle |
bool | False | 如果为 True ,则在每个 epoch 开始时打乱数据集。对于训练集通常设置为 True ,而对于验证集或测试集则为 False 。 |
sampler |
Sampler | None | 自定义样本采样器。如果指定了 sampler ,则忽略 shuffle 参数。常用的是 RandomSampler 和 SequentialSampler 。 |
batch_sampler |
BatchSampler | None | 自定义批次采样器。如果指定了 batch_sampler ,则忽略 batch_size 、shuffle 和 sampler 参数。 |
num_workers |
int | 0 | 加载数据时使用的子进程数。设置为 0 表示在主进程中加载数据。增加此参数可以加快数据加载速度,但也会占用更多内存和CPU资源。 |
collate_fn |
callable | None | 用于合并一个批次的数据样本的函数。默认情况下,PyTorch 会自动将张量堆叠在一起。如果你的数据结构更复杂,可能需要自定义此函数。 |
pin_memory |
bool | False | 如果为 True ,则将数据加载到固定内存(pinned memory),以便更快地传输到GPU。适用于使用GPU进行训练的情况。 |
drop_last |
bool | False | 如果数据集大小不能被 batch_size 整除,则最后一个不完整的批次是否丢弃。如果为 True ,则最后一个批次会被丢弃。 |
timeout |
numeric | 0 | 等待数据加载的最大时间(以秒为单位)。如果超过此时间仍未获取到数据,则抛出异常。0 表示无超时限制。 |
worker_init_fn |
callable | None | 每个工作进程初始化时调用的函数。可用于设置随机种子等操作。 |
multiprocessing_context |
context | None | 设置多进程上下文,指定如何启动子进程。适用于高级用户,通常不需要更改。 |
1 | import numpy as np |
6 神经网络
6.1 简单的线性模型
1 | import random |
1 | # 定义模型 |
6.2 多层感知机
1 | from torch import nn |
1 | from torch import nn |
1 | from torch import nn |