当前位置: 首页 > news >正文

昇思25天学习打卡营第24天|ResNet50迁移学习

课程打卡凭证

迁移学习

迁移学习是机器学习中一个重要的技术,通过在一个任务上训练的模型来改善在另一个相关任务上的表现。在深度学习中,迁移学习通常涉及在一个大型数据集(如ImageNet)上预训练的模型上进行微调,以便它可以应用于目标数据集。这里将使用迁移学习对ImageNet数据集的狼和狗进行分类。

数据集准备与加载

下载数据集。

定义初始值。

导入必要的库和模块。

定义数据集的目录路径,分别用于训练和验证数据集。

使用ImageFolderDataset方法加载图像数据集,并指定并行工作线程数和是否打乱数据。

定义图像的均值和标准差,用于归一化操作。scale用于调整图像大小。

对于训练数据集,进行随机裁剪、随机水平翻转、归一化和格式转换的操作。对于验证数据集,进行解码、调整大小、中心裁剪、归一化和格式转换的操作。

使用定义的预处理操作对图像数据进行映射,再将数据集进行批量处理,并返回处理好的数据集。最后调用函数创建训练和验证数据集,并获取每个数据集的大小。

从数据集中加载一个批次的图像和标签,并打印它们的形状和标签信息。

对上述数据和标签进行可视化,结果如下图所示。

构建ResNet50网络

导入必要的库和模块,设置参数初始值。

初始化残差块,接受输入通道数、输出通道数、步长、归一化层和下采样层作为参数。其中归一化层默认为nn.BatchNorm2d。

定义两个卷积层,卷积核大小为 3x3,使用ReLU激活函数。定义下采样层,用于在输入和输出维度不同时调整输入维度。

主分支第一层将输入通过第一个卷积层和归一化层,然后应用ReLU激活函数。主分支第二层则将输出通过第二个卷积层和归一化层。将主分支的输出和identity相加,形成残差连接。最后,再次应用ReLU激活函数。

始化了残差块,接受输入通道数、输出通道数、步长和下采样层作为参数。

  • self.conv1定义了一个1x1卷积层,用于减少通道数。
  • self.norm1对应第一个卷积层的批归一化层。
  • self.conv2定义了一个3x3卷积层,用于特征提取,步长由 stride 参数决定。
  • self.norm2对应第二个卷积层的批归一化层。
  • self.conv3定义了一个1x1卷积层,用于恢复通道数,通道数为 out_channel 的4倍。
  • self.norm3对应第三个卷积层的批归一化层。
  • self.relu定义了ReLU激活函数。
  • self.down_sample定义了下采样层,用于在输入和输出维度不同时调整输入维度。

主分支第一层将输入通过第一个1x1卷积层和归一化层,然后应用ReLU激活函数。主分支第二层将输出通过第二个3x3卷积层和归一化层,然后应用ReLU激活函数。主分支第三层将输出通过第三个1x1卷积层和归一化层。再将主分支的输出和identity相加,形成残差连接。最后,再次应用ReLU激活函数。

定义函数用于构建ResNet网络中的一个层,该层由多个残差块堆叠而成。通过判断是否需要下采样来调整输入维度,并通过循环堆叠指定数量的残差块。

定义一个ResNet类,用于构建ResNet50模型。

定义ResNet网络的前向传播过程。

函数 _resnet 用于实例化ResNet并加载预训练模型。

resnet50函数用于构建和返回一个ResNet50模型。

固定特征进行训练

导入必要的库和模块,加载预训练的ResNet50模型。

获取并修改全连接层的输入通道数,再将ResNet50的全连接层输出通道数改为2,用于狼和狗的二分类。最后修改平均池化层的kernel size为7。

冻结模型中除最后一层外的所有参数,以避免这些层在训练过程中更新。

使用动量优化器,并设定学习率和动量。定义交叉熵损失函数。

定义前向传播函数 forward_fn,计算预测值和损失。使用 ms.value_and_grad 获取前向传播和梯度计算的函数 grad_fn。定义训练步骤函数 train_step,计算损失和梯度,并更新模型参数。最后实例化训练模型。

加载数据集并设置训练和验证数据迭代器,设置训练参数。

导入必要的库和模块,初始化训练循环。

定义训练循环。

在每个训练轮次结束后,使用验证数据集评估模型的准确率。记录训练轮次结束时间,并计算本轮训练的总时间以及每步的平均时间。打印当前训练轮次的平均训练损失和准确率,以及训练时间统计。

保存最佳模型,打印结束信息。

训练结果如图所示。

可视化模型预测

可视化模型的预测结果,展示图像及其预测类别,结果如下图所示。

http://www.lryc.cn/news/404571.html

相关文章:

  • Shell 构建flutter + Navtive 生成IPA
  • python gradio 的输出展示组件
  • SwiftUI 6.0(Xcode 16)新 PreviewModifier 协议让预览调试如虎添翼
  • STM32被拔网线 LWIP的TCP无法重连解决方案
  • Linux下开放指定端口
  • 亚马逊测评行为的识别与防范:教你如何搭建安全的测评环境
  • 如何通过成熟的外发平台,实现文档安全外发管理?
  • SCI一区级 | Matlab实现SSA-CNN-GRU-Multihead-Attention多变量时间序列预测
  • Mysql中的几种常见日志
  • 2024年7月22日(nfs samba)
  • 黑龙江网络安全等级保护测评策略概述
  • 笔记 7 :linux 011 注释,函 bread () , get_hash_table () , find_buffer ()
  • vscode配置latex环境制作【文档、简历、resume】
  • 如何学习Spark:糙快猛的大数据之旅
  • 交换机(Switches)和桥(Bridges)的区别
  • 基于springboot+vue的汽车租赁管理系统
  • 《0基础》学习Python——第二十二讲__网络爬虫/<5>爬取豆瓣电影封面图
  • 全新UI自助图文打印系统小程序源码/自助云打印机前后端源码
  • yolo5图片视频、摄像头推理demo
  • Scala学习笔记19: 隐式转换和隐式参数
  • 用户登录安全是如何保证的?如何保证用户账号、密码安全?
  • Java 写一个可以持续发送消息的socket服务端
  • Ubuntu2204搭建ceph17
  • Druid 面试题及答案整理,最新面试题
  • 数据库基础与安装MYSQL数据库
  • 昇思25天学习打卡营第18天| DCGAN生成漫画头像
  • 【面试八股文】计算机操作系统
  • 宝塔Wordpress 插件 Redis object cache 导致内存很高 80%以上的原因和解决
  • node解析Excel中的考试题并实现在线做题功能
  • 怎么降低美国服务器硬盘故障率?