锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2024-01-05 07:37:01 hs3一组常开10a继电器

这个吃瓜教程是Datawhale组织团队学习 。
学习资料由开源学习组织Datawhale提供。
开源贡献:李嘉琪、牛志康、刘洋、陈安东、陈玉立、刘兴、郭棉升、乔斌、匡俊伟
笔记的分来自网络检索。如果有侵权联系,可以删除
本研究的对象:
具有高数、线代、概率论的基础,具有一定的机器学习和深度学习基础,熟悉常见概念Python。
内容说明:PyTorch从基础知识到项目实战,理论与实践相结合。
学习周期:14天

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

Task03学习内容

  • 第六章 PyTorch先进的训练技巧
    • 6.1 自定义损失函数
      • 6.1.1 函数定义
      • 6.1.2 以类的方式定义
    • 6.2 学习率的动态调整
      • 6.2.1 使用官方scheduler
  • 小结

第六章 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()后面进行使用。

小结

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章