pytorch损失函数和优化器

损失函数和优化器

1 损失函数

损失函数可以当作是nn的某一个特殊层,也是nn.Module的子类。但是实际中。然而在实际使用中通常将这些loss function专门提取出来,和主模型互相独立。

score=t.randn(3,2)                  //batch_size=3,类别是2.
label=t.Tensor([1,0,1].long())      //注意label必须得是longTensor
criterion=nn.CrossEntropyLoss()     //CroosEntropyLoss是常用的二分类损失函数
loss=criterion(score,label)

2 优化器

所有的优化方法都封装在torch.optim里面,他的设计很灵活,可以扩展为自定义的优化方法。
所有的优化方法都是继承了基类optim.Optimizer。并实现了自己的优化步骤。
关于优化器需要掌握:
2. 1 优化方法基本使用

import optim
ptimizer=optim.SGD(params=net.parameters(),lr=0.1)
optimizer.zero_grad()  //梯度清零
​
output=net(input)
output.backward(output)
optimizer.step()

2.2 如何为不同的层设置不同的学习率
法1:

# 为不同子网络设置不同的学习率,在finetune中经常用到
# 如果对某个参数不指定学习率,就使用最外层的默认学习率
optimizer =optim.SGD([
                {'params': net.features.parameters()}, # 学习率为1e-5
                {'params': net.classifier.parameters(), 'lr': 1e-2}
            ], lr=1e-5)
            

法2:

# 只为两个全连接层设置较大的学习率,其余层的学习率较小
special_layers = nn.ModuleList([net.classifier[0], net.classifier[3]])
special_layers_params = list(map(id, special_layers.parameters()))
base_params = filter(lambda p: id(p) not in special_layers_params,
                     net.parameters())
​
optimizer = t.optim.SGD([
            {'params': base_params},
            {'params': special_layers.parameters(), 'lr': 0.01}
        ], lr=0.001 )
optimizer

2.3 如何调整学习率
法1(比较推荐):新建一个optimizer。对于使用动量的优化器(如Adam),会丢失动量等状态信息,可能会造成损失函数的收敛出现震荡等情况

old_lr = 0.1
optimizer1 =optim.SGD([
                {'params': net.features.parameters()},
                {'params': net.classifier.parameters(), 'lr': old_lr*0.1}
            ], lr=1e-5)
optimizer1

法2:一种是修改optimizer.param_groups中对应的学习率

# 方法2: 调整学习率, 手动decay, 保存动量
for param_group in optimizer.param_groups:
    param_group['lr'] *= 0.1 # 学习率为之前的0.1倍
optimizer

原文链接:pytorch—损失函数和优化器

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值