news 2026/1/9 9:11:52

Day47_预训练模型与迁移学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day47_预训练模型与迁移学习
# 4. 定义 MobileNetV2 模型 def create_mobilenet_v2(pretrained=True, num_classes=10): model = models.mobilenet_v2(pretrained=pretrained) # MobileNetV2 的分类器结构: # (classifier): Sequential( # (0): Dropout(p=0.2, inplace=False) # (1): Linear(in_features=1280, out_features=1000, bias=True) # ) # 修改最后一层全连接层 # 获取分类器中最后一个线性层的输入特征数 in_features = model.classifier[1].in_features model.classifier[1] = nn.Linear(in_features, num_classes) return model.to(device) # 5. 冻结/解冻模型层的函数 def freeze_model(model, freeze=True): """冻结或解冻模型的特征提取层参数""" # MobileNetV2 的特征提取部分是 'features' for param in model.features.parameters(): param.requires_grad = not freeze # 打印冻结状态 frozen_params = sum(p.numel() for p in model.parameters() if not p.requires_grad) total_params = sum(p.numel() for p in model.parameters()) if freeze: print(f"已冻结模型特征层参数 ({frozen_params}/{total_params} 参数)") else: print(f"已解冻模型所有参数 ({total_params}/{total_params} 参数可训练)") return model
# 6. 训练函数 def train_model(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs, freeze_epochs=1): train_loss_history = [] test_acc_history = [] # 初始冻结 if freeze_epochs > 0: model = freeze_model(model, freeze=True) for epoch in range(epochs): # 解冻控制 if epoch == freeze_epochs: print(f"Epoch {epoch}: 解冻所有参数,开始微调...") model = freeze_model(model, freeze=False) # 解冻后通常使用更小的学习率 for param_group in optimizer.param_groups: param_group['lr'] *= 0.1 model.train() running_loss = 0.0 correct = 0 total = 0 for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() running_loss += loss.item() _, predicted = output.max(1) total += target.size(0) correct += predicted.eq(target).sum().item() if (batch_idx + 1) % 200 == 0: print(f"Epoch {epoch+1} | Batch {batch_idx+1}/{len(train_loader)} | Loss: {loss.item():.4f}") epoch_loss = running_loss / len(train_loader) train_acc = 100. * correct / total # 测试 model.eval() correct_test = 0 total_test = 0 with torch.no_grad(): for data, target in test_loader: data, target = data.to(device), target.to(device) output = model(data) _, predicted = output.max(1) total_test += target.size(0) correct_test += predicted.eq(target).sum().item() test_acc = 100. * correct_test / total_test train_loss_history.append(epoch_loss) test_acc_history.append(test_acc) if scheduler: scheduler.step() print(f"Epoch {epoch+1} End | Train Loss: {epoch_loss:.4f} | Train Acc: {train_acc:.2f}% | Test Acc: {test_acc:.2f}%") return train_loss_history, test_acc_history # 主运行逻辑 def run_training(): # 减少 epoch 数以节省时间演示 epochs = 5 freeze_epochs = 2 learning_rate = 0.001 model = create_mobilenet_v2(pretrained=True, num_classes=10) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate) scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=3, gamma=0.1) print("开始训练 MobileNetV2...") train_loss, test_acc = train_model( model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs, freeze_epochs ) # 简单绘图 plt.figure(figsize=(10, 4)) plt.subplot(1, 2, 1) plt.plot(train_loss, label='Train Loss') plt.title('Training Loss') plt.legend() plt.subplot(1, 2, 2) plt.plot(test_acc, label='Test Acc') plt.title('Test Accuracy') plt.legend() plt.show() if __name__ == "__main__": run_training()

@浙大疏锦行

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/31 21:29:11

手把手教你使用单片机驱动有源蜂鸣器发声

用单片机让蜂鸣器“开口说话”:从原理到实战的完整指南你有没有遇到过这样的场景?按下电饭煲按钮没反应,不知道是按对了还是坏了;工业设备报警灯闪个不停,但没人注意到——这时候,如果能“嘀”一声提醒&…

作者头像 李华
网站建设 2025/12/25 6:01:02

GTNH中文汉化完整解决方案:三步完成一键配置

GTNH中文汉化完整解决方案:三步完成一键配置 【免费下载链接】Translation-of-GTNH GTNH整合包的汉化 项目地址: https://gitcode.com/gh_mirrors/tr/Translation-of-GTNH GTNH中文汉化为Minecraft经典整合包GregTech: New Horizons提供完整的中文本地化支持…

作者头像 李华
网站建设 2025/12/25 6:00:48

Ofd2Pdf极速转换手册:零基础轻松搞定OFD转PDF

Ofd2Pdf极速转换手册:零基础轻松搞定OFD转PDF 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf 想要快速将OFD文件转换成PDF格式吗?Ofd2Pdf这款专业转换工具正是您需要的解决方案…

作者头像 李华
网站建设 2026/1/6 14:12:28

Webcamoid终极指南:解锁专业级摄像头增强方案

Webcamoid终极指南:解锁专业级摄像头增强方案 【免费下载链接】webcamoid Webcamoid is a full featured and multiplatform webcam suite. 项目地址: https://gitcode.com/gh_mirrors/we/webcamoid 您是否曾经为在线会议的画面质量感到困扰?是否…

作者头像 李华
网站建设 2025/12/25 6:00:08

Webcamoid完整指南:免费打造专业级网络摄像头效果的终极方案

Webcamoid完整指南:免费打造专业级网络摄像头效果的终极方案 【免费下载链接】webcamoid Webcamoid is a full featured and multiplatform webcam suite. 项目地址: https://gitcode.com/gh_mirrors/we/webcamoid 想要让普通的网络摄像头瞬间升级为专业级视…

作者头像 李华
网站建设 2025/12/25 5:59:17

如何快速下载直播视频:m3u8-downloader完整使用指南

你是否曾经遇到过这样的困扰?正在观看一场精彩的直播,想要保存下来反复欣赏,却发现无法下载。或者看到喜欢的教育视频,想要离线学习却无从下手?这正是m3u8-downloader项目要解决的核心问题。m3u8-downloader是一款使用…

作者头像 李华