张量
k维度张量,维度为
存储顺序是一般从
开始:
先填满
,
一个元素张量中的下标为
, 那么它在内存中是第
计算图
神经网络记录计算图, 结点为运算操作(operator),边为张量。
静态图(static graph):以前的TensorFlow caffe
动态图: Pytorch
静态图:先引擎构建图并且可以进行优化,然后不在过程中更改。然后进行正向,反向传播。缺点在于不灵活,不能在传播过程中debug。
自动求导
静态图: 计算图构建完成时候,反向传播路径也同时完成。
动态图:构建前向计算图的时候给每个输出张量绑定一个***反向传播的梯度计算函数***,当计算图到达最终损失函数张量的时候,直接调用这个张量的反向传播函数,并不断地递归反向传播函数。
动态计算图: 优化器 先和 权重张量 绑定。反向传播完成后,权重张量又和对应的梯度张量绑定,然后优化器根据绑定的梯度张量更新权重张量。
pytorch主要模块
torch模块包含了本身常使用的激活函数,torch.sigmoid, torch.relu, torch.tanh以及矩阵的乘法torch.mm,张量元素的选择torch.select。
torch.Tensor 模块
任何方法后缀带了_的都是直接修改本身数据。
torch.Storage 负责torch.Tensor的底层数据存储
torch.sparse
稀疏表达
torch.CUDA
GPU有关
=========================================
torch.nn
非常重要!!!
一般用来继承它。
nn.Linear
nn.Conv1d
nn.Conv2d
nn.Conv3d
torch.nn.MSELoss
torch.nn.CrossEntropyLoss
torch.nn.functional
激活函数和池化函数
torch.nn.init
神经网络初始化
torch.nn.init.uniform_
torch.nn.init.normal_
torch.optim
优化器
torch.optim.SGD
torch.optim.AdaGrad
torch.optim.RMSprop
torch.optim.Adam
torch.optim.lr_scheduler 学习率衰减子模块
torch.optim.lr_scheduler.StepLR 阶梯下降
torch.optim.lr_scheduler.CosineAnnealingLR 余弦退火
torch.autograd
torch.autograd.backward
torch.onnx
ONNX格式存在是为了方便不同框架之间的模型交换。
torch的辅助工具模块
torch.utils.bottleneck
检查模块运行时间,找到导致性能瓶颈的模块。
torch.utils.checkpoint
节约内存
时间换空间内存,丢弃中间数据,只记录计算过程。
torch.utils.data
引入了Dataset 和 DataLoader,得到shuffle 和 sample 后的迷你小批次数据集。
torch.utils.tensorboard
数据可视化工具,可视化中间张量,损失函数,张量权重的直方图,一节中间文本,视频,图像。
张量的创建和修改
张量类型转换
torch.tensor(a, dtype = torch.float32)
或者 torch.tensor(a).to(torch.float32)
张量存储设备
device = ‘cpu’
device = ‘cuda:0’
n个GPU设备编号 cuda:0. … cuda:n-1
torch.tensor(a, device = 'cuda:3')
GPU->CPU
设备之间的转移可以用to、.cpu()
torch.ones_like(a, device=“cuda:4”).cpu()
torch.ones_like(a, device = ‘cuda:4’).to(‘cuda:0’)
view +contiguous == reshape
t = torch.tensor(a)
t.view(-1,3)
view函数不改变底层数据存储,只改变维度步长信息。
如果需要复制数据,需要调用contiguous()。
张量拼接与分割
t1 = torch.rand(3,4)
t2 = torch.rand(3,4)
t3 = torch.rand(3,4)
t.cat([t1,t2,t3, t4], -1)
#3*(4+4+4)
t.stack([t1 t2, t3], -1)
#3*4*3
张量的扩张与压缩
t = torch.randn(3,4)
t.unsqueeze(-1).shape
# 3*4*1
t = torch.rand(1,3,4,1)
torch.squeeze()
#压缩所有为1 的维度
张量的广播
必须有相同维度
3 1 4 + 3 3 4
第二维度复制3遍,然后一一相加
简单模型初始化化要把 tensor张量变成Parameter才能被optim优化器访问到!
Pytorch优化器直接接收模型的参数生成器作为函数的参数。
self.weight = nn.Parameter( torch.rand(n_dim,1) )
model.named_parameters()
model.parameters()
张量绑定的梯度张量不清空的话,会一直逐渐积累,因此要在反向传播之前optim.zero_grad()
model = LinarModel(..) # 初始化模型
criterion = nn.MSELoss() # 初始化损失函数criterion
for step in range(..):
predict = model(x) # 预测
loss = criterion(preict, target) # 损失函数
optim.zero_grad()#优化器清空之前反向传播的梯度
loss.backward() #损失函数反向传播
optim.step()# 优化器进行梯度下降优化
pytorch数据输入和预处理
数据载入类
torch.utils.data.DataLoader
DataLoader(dataset, batch_size =1, shuffle = False, sampler = None, batch_sampler =None, num_workers =0, collate_fn = None, pin_memory = False, drop_last = False, timeout =0, worker_init_fn = None)
要想使用DataLoader,必须要获得对应的dataset
模型保存方式
保存模型实例
保存模型状态字典
model.state_dict()
model.load_state_dict(t)
检查点设置!
save_info = {#保存的信息
"iter_num": iter_num, #迭代步数
"optimizer": optimizer.state_dict(), #优化器状态字典
"model": model.state_dict() # 模型状态字典
}
torch.save(save_info, save_path)
save_info = torch.load(save_info)
optimizer.load_state_dict(save_indo["optimizer"])
model.load_state_dict(save_indo["model"])