一、神经网络工具箱nn
1、nn.Module
nn.Module是nn的一个核心数据结构,它可以是神经网络的某个层,也可以是包含多层的神经网络。在实际使用中,最常见的做法是继承nn.Module,生成自己的网络/层。nn中已经实现了绝大多数层,包括全连接层、损失层、激活层、卷积层、循环层等,这些都是nn.Module的子类,能够自动检测到自己的Parameter,并将其作为学习参数,且针对GPU运行进行了cuDNN优化。
2、nn.functional
nn中的层,一类是继承了nn.Module,其命名一般为nn.Xxx(第一个是大写),如nn.Linear、nn.Conv2d、nn.CrossEntropyLoss等。另一类是nn.functional中的函数,其名称一般为nn.functional.xxx,如nn.functionallinear、nn.functional.conv2d等。
从功能来说两者相当,基于nn.Module能实现的层,使用nn.functional也可以实现,反之亦然。
Pytorch官方推荐:具有学习参数的,例如linear,conv2d,batch_norm,采用nn.Xxx方式。没有学习参数的,例如maxpool,loss func,activation func等根据个人选择使用二者皆可。
二、优化器
Pytorch常用的优化方法都封装在torch.optim里面,其设计灵活,可以扩展为自定义的优化方法。所有的优化方法都是继承了基类optim.Optimizer。
使用优化器的一般步骤为:
1.建立优化器实例
导入optim模块,实例化SGD优化器
import torch.optim as optim
optimizer = optim.SGD(model.parameters(),lr=lr,momentum=momentum)
2.前向传播
把输入数据传入神经网络Net实例化对象model中,自动执行forward函数,得到out输出值,然后out与标记label计算损失值loss。
out = model(img)
loss = criterion(out,label)
3.清空梯度
缺省情况下题都是累加的,在提督反响传播前,先需把梯度清零。
optimizer.zero_grad()
4.反向传播
给予损失值,把梯度之进行反向传播
loss.backward()
5.更新参数
基于当前梯度(存储在参数的.grad属性中)更新参数
optimizer.step()
3.动态修改学习率参数
直接采用修改参数optimzer.param_groups。
optimzer.param_groups:长度为1的list,optimzer.param_groups[0]:长度为6的字典,包括权重参数、lr、momentum等参数。
print(len(optimizer.am_groups[0]))#结果为6
例:
for epoch in range(num_epoched):par
#动态修改参数学习率
if epoch%5 = 0:
optimizer.am_groups[0])['lr'] *=0.1
for img,label in train_loader:
#######