深度学习 —— 调整学习率(finetune)

本文深入探讨了PyTorch中的优化方法,包括如何使用基本的优化器,为模型的不同部分设置不同的学习率,以及如何调整学习率。通过实例展示了随机梯度下降法(SGD)的使用,并介绍了调整学习率的两种常见方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PyTorch将深度学习中常用的优化方法全部封装在torch.optim中,其设计十分灵活,能够很方便的扩展成自定义的优化方法。

所有的优化方法都是继承基类optim.Optimizer,并实现了自己的优化步骤。下面就以最基本的优化方法——随机梯度下降法(SGD)举例说明。这里需重点掌握:

  • 优化方法的基本使用方法
  • 如何对模型的不同部分设置不同的学习率
  • 如何调整学习率
# 首先定义一个LeNet网络
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() # 梯度清零,等价于net.zero_grad()

input = t.randn(1, 3, 32, 32)
output = net(input)
output.backward(output) # fake backward

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

在这里插入图片描述

# 只为两个全连接层设置较大的学习率,其余层的学习率较小
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

在这里插入图片描述

对于如何调整学习率,主要有两种做法。一种是修改optimizer.param_groups中对应的学习率,另一种是更简单也是较为推荐的做法——新建优化器,由于optimizer十分轻量级,构建开销很小,故而可以构建新的optimizer。但是后者对于使用动量的优化器(如Adam),会丢失动量等状态信息,可能会造成损失函数的收敛出现震荡等情况。

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

在这里插入图片描述

# 方法2: 调整学习率,新建一个optimizer
old_lr = 0.1
optimizer1 =optim.SGD([
                {'params': net.features.parameters()},
                {'params': net.classifier.parameters(), 'lr': old_lr*0.1}
            ], lr=1e-5)
optimizer1

在这里插入图片描述

### 基于深度学习的安全帽检测方法实现 #### 使用YOLOv8进行安全帽检测 为了实现实时且高效的工人佩戴安全帽状况的监控,可以采用YOLOv8作为核心的目标检测算法[^1]。此模型因其快速推理速度和较高的准确性而被广泛应用于各种场景下的物体识别任务中。 在具体实施过程中,首先需要收集并标注大量含有戴/未戴安全帽的人物图片来组成训练集;接着利用这些数据对预训练好的YOLOv8权重文件进一步微调(fine-tune),使其能够更好地适应特定应用场景的需求。完成上述准备工作之后,便可以通过部署优化后的模型到边缘计算设备上来达到实时监测的目的。 ```python import torch from ultralytics import YOLO model = YOLO('yolov8n.pt') # 加载基础版本YOLOv8模型 results = model.train(data='path/to/dataset', epochs=100, imgsz=640) # 训练模型 ``` #### 用户界面设计 除了强大的后台处理能力之外,友好的前端交互同样不可或缺。为此可以选择PyQt5框架搭建GUI应用程序,它允许开发者轻松创建跨平台桌面软件。通过集成摄像头输入源以及调用已训练完毕的对象探测器API接口,最终形成一套完整的解决方案——即当捕捉到的画面中有任何一位工作人员忘记穿戴必要的保护装置时,系统会立即发出警报提示音并向指定位置发送通知消息提醒相关人员注意安全隐患的存在。 ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel from PyQt5.QtGui import QImage, QPixmap import cv2 class MainWindow(QMainWindow): def __init__(self): super().__init__() self.label = QLabel(self) cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() # 这里应该加入YOLOv8预测逻辑 image = QImage(frame.data, frame.shape[1], frame.shape[0], QImage.Format_RGB888).rgbSwapped() pixmap = QPixmap.fromImage(image) self.label.setPixmap(pixmap) QApplication.processEvents() if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.showFullScreen() # 设置为全屏显示以便更直观地观察效果 sys.exit(app.exec_()) ``` #### 关键性能指标考量 对于此类应用而言,以下几个方面尤为值得关注: - **实时性**:确保能够在每秒内处理多帧画面,从而满足实际工作环境中连续不断的视觉信息流分析需求; - **精度与召回率**:尽可能减少错误分类的情况发生,特别是在复杂背景下也要维持良好的表现水平; - **鲁棒性**:无论是在白天还是夜晚、晴天或是阴雨天气下都能稳定运行不受影响[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值