测试版本:
torch1.7.1 + CPU

python 3.6

1、损失函数

import torch as t
from torch import nn

损失函数可看做一种特殊的Layer,但是在实际使用中,经常把损失函数和其他部分独立出来。
下面是交叉熵误差函数的例子

score = t.randn(3,2)
lable = t.Tensor([1,0,1]).long()
criterion = nn.CrossEntropyLoss()
loss = criterion(score,lable)
loss
tensor(1.0914)

2、优化器

常用的优化方法全都封装在torch.optim中

重点需要掌握

  • 优化器的基本使用
  • 如何针对不同部分设定不同的学习率
  • 如何调整学习率
# 定义一个网络
class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.features = nn.Sequential(
        nn.Conv2d(3,6,5),
        nn.ReLU(),
        nn.MaxPool2d(2,2),
        nn.Conv2d(6,16,5),
        nn.ReLU(),
        nn.MaxPool2d(2,2)
        )
        self.classifier = nn.Sequential(
        nn.Linear(16*5*5,120),
        nn.ReLU(),
        nn.Linear(120,84),
        nn.ReLU(),
        nn.Linear(84,10)
        )
    def forward(self,x):
        x = self.features(x);
        x = x.view(-1,16*5*5)
        x = self.classifier(x)
        return x

net = Net()
from torch import optim
optimizer = optim.SGD(params=net.parameters(), lr = 1)
optimizer.zero_grad()
input = t.randn(1,3,32,32)
output = net(input)
output.backward(output)
optimizer.step()#优化

为不同部分设定不同的学习率:

optimizer = optim.SGD([
    {'params':net.features.parameters()},
    {'params':net.classifier.parameters(),'lr':1e-2},   
],lr=1e-5) #列表外是默认学习率

(这是比较简便的做法,新建optimizer)但缺点是新建的optimizer会初始化动量等信息,导致某些使用动量的优化器出现震荡问题
有更好但相对复杂的做法,这里先不考虑。

3、nn.functional

nn.functional与nn.Module的区别几乎是相同的,区别在于nn.functional中没有可学习的参数

Module中的哪些不具有可学习参数的层(比如ReLU),就可以用nn.functional中的函数代替

不过dropout尽管没有可学习参数,也不要使用nn.functional中的函数

4、初始化策略

nn.init模块专为初始化设计。
用户也可以自定义初始化策略。

import torch as t
from torch import nn
from torch.nn import init
linear = nn.Linear(3,4)
t.manual_seed(1)
init.xavier_normal_(linear.weight)
Parameter containing:
tensor([[ 0.3535,  0.1427,  0.0330],
        [ 0.3321, -0.2416, -0.0888],
        [-0.8140,  0.2040, -0.5493],
        [-0.3010, -0.4769, -0.0311]], requires_grad=True)