六月份组队学习【深入浅出PyTorch】Task04打卡笔记

本次吃瓜教程是Datawhale组织的组队学习 。
学习资料由开源学习组织Datawhale提供。
开源贡献:李嘉骐、牛志康、刘洋、陈安东、陈玉立、刘兴、郭棉昇、乔彬、邝俊伟
笔记部分内容来源于网络检索,如有侵权联系可删
本次学习针对的对象:
具备高数、线代、概率论基础,有一定的机器学习和深度学习基础,熟悉常见概念,会使用Python。
内容说明:PyTorch理论与实践结合,由基础知识到项目实战。
学习周期:14天

教程链接:https://datawhalechina.github.io/thorough-pytorch/index.html
B站视频:BV1L44y1472Z
学习者手册:https://mp.weixin.qq.com/s/pwWg0w1DL2C1i_Hs3SZedg

第六章 PyTorch进阶训练技巧

6.1 自定义损失函数

PyTorch在torch.nn模块为我们提供了许多常用的损失函数,比如:MSELoss,L1Loss,BCELoss… 但是随着深度学习的发展,出现了越来越多的非官方提供的Loss,比如DiceLoss,HuberLoss,SobolevLoss… 这些Loss Function专门针对一些非通用的模型,PyTorch不能将他们全部添加到库中去,因此这些损失函数的实现则需要我们通过自定义损失函数来实现。

  • MSELoss(Mean Squared Error)
    均方误差
    在这里插入图片描述
  • L1Loss
    平均绝对误差

6.1.1 以函数方式定义

def my_loss(output, target):
    loss = torch.mean((output - target)**2)
    return loss

但在实际搭建中,我们常用的还是类的方式来定义损失函数

6.1.2 以类方式定义

在以类方式定义损失函数时,我们如果看每一个损失函数的继承关系我们就可以发现Loss函数部分继承自_loss, 部分继承自_WeightedLoss, 而_WeightedLoss继承自_loss, _loss继承自 nn.Module。我们可以将其当作神经网络的一层来对待,同样地,我们的损失函数类就需要继承自nn.Module类。在学习时教程中使用DiceLoss为例(Dice Loss是一种在分割领域常见的损失函数)
在这里插入图片描述
代码实现:

class DiceLoss(nn.Module):
    def __init__(self,weight=None,size_average=True):
        super(DiceLoss,self).__init__()
        
    def forward(self,inputs,targets,smooth=1):
        inputs = F.sigmoid(inputs)       
        inputs = inputs.view(-1)
        targets = targets.view(-1)
        intersection = (inputs * targets).sum()                   
        dice = (2.*intersection + smooth)/(inputs.sum() + targets.sum() + smooth)  
        return 1 - dice

# 使用方法    
criterion = DiceLoss()
loss = criterion(input,targets)

6.2 动态调整学习率

学习率(Learning rate) 作为监督学习以及深度学习中重要的超参,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值。合适的学习率能够使目标函数在合适的时间内收敛到局部最小值。

6.2.1 使用官方scheduler

  • 了解官方提供的API
    PyTorch已经在torch.optim.lr_scheduler为我们封装好了一些动态调整学习率的方法供我们使用。
  • 使用官方API
# 选择一种优化器
optimizer = torch.optim.Adam(...) 
# 选择上面提到的一种或多种动态调整学习率的方法
scheduler1 = torch.optim.lr_scheduler.... 
scheduler2 = torch.optim.lr_scheduler....
...
schedulern = torch.optim.lr_scheduler....
# 进行训练
for epoch in range(100):
    train(...)
    validate(...)
    optimizer.step()
    # 需要在优化器参数更新之后再动态调整学习率
	scheduler1.step() 
	...
    schedulern.step()

我们在使用官方给出的torch.optim.lr_scheduler时,需要将scheduler.step()放在optimizer.step()后面进行使用。

小结

针对第六章的前半部分进行一些学习中的笔记总结,还有两次打卡希望可以坚持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值