热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pytorch训练过程acc_Pytorch学习笔记(三)——利用迁移学习训练分类网络

在学习pytorch过程中遇到的一些难题,博主在这里进行记录。主要针对官网里面例子的代码,其中对有些基础python知识与pytorch中的接口函数细节
7389d0f88f724a06d7fa66381ee09628.png

在学习pytorch过程中遇到的一些难题,博主在这里进行记录。主要针对官网里面例子的代码,其中对有些基础python知识与pytorch中的接口函数细节理解。

这个例子介绍如何用PyTorch进行迁移学习训练一个ResNet模型来对蚂蚁和蜜蜂进行分类。

数据增强与存放

b93df48213f576d8eba66583dc7e5b0f.png

1.transforms是很常用的图片变换方式,可以通过compose将各个变换串联起来。class torchvision.transforms.Compose (transforms) 这个类将多个变换方式结合在一起,参数:各个变换的实例对象。torchvision.transforms.RandomSizedCrop是做crop的。需要注意的是对于torchvision.transforms.RandomSizedCrop和transforms.RandomHorizontalFlip()等,输入对象都是PIL Image,也就是用python的PIL库读进来的图像内容。

2. torchvision.transforms.ToTensor,将PIL图片或者numpy.ndarray转成Tensor类型的,将PIL图片或者numpy.ndarray(HxWxC) (范围在0-255) 转成torch.FloatTensor (CxHxW) (范围为0.0-1.0)

3.data_dir = 'data/hymenoptera_data’这是存放数据集的地址。数据导入是从datasets.ImageFolder接口实现的。os.path.join()函数用于路径拼接文件路径。因为数据集中有train与val,所以需要用 for x in [‘train’, ‘val’]来循环完成数据存放。这里image_datasets是一个字典,返回image_datasets[‘train’],image_datasets[‘val]两个tuple,每个tuple包含图像和标签信息。

4.datasets.ImageFolder返回的是字典,并不能作为模型的输入,所以torch.utils.data.DataLoader类将其转变为Tensor数据模式。

训练模型

a23d0cd59d891b79c4a84ddd29d6bd6b.png
e32851d573e861e147b5ca81effc3f26.png

这里的主要操作有:Scheduling the learning rate(规划学习率)、Saving the best model(保存最优模型)

先介绍 scheduler 的用法:

制定任意一层的学习率(多个参数组):下面为两个参数组

cfd9a5fb856196cf0679ba0e7599827c.png

那么多个参数组如何进一步调整学习率呢?用到torch.optim.lr_scheduler ,它提供了几种方法来根据epoches的数量调整学习率。有些优化算法已经拥有了学习率衰减参数lr_decay 。

torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)

其中optimizer就是包装好的优化器,step_size (int) 为学习率衰减期,指几个epoch衰减一次。gamma为学习率衰减的乘积因子。 默认为0.1 。当last_epoch=-1时,将初始lr设置为lr。

best_model_wts = copy.deepcopy(model.state_dict()) 先深拷贝一份当前模型的参数,后面迭代过程中若遇到更优模型则替换。

scheduler.step() 训练的时候进行学习率规划,其定义在下面给出。

if phase == ‘val’ and epoch_acc > best_acc: 当验证时遇到了更好的模型则予以保留

best_model_wts = copy.deepcopy(model.state_dict()) 深拷贝模型参数

model.load_state_dict(best_model_wts) # 载入最优模型参数

Finetuning the convnet

加载预训练模型并重置最终完全连接的图层。注意这里是对所有层参数进行微调。

1b509f5c656170a121c4523286d64f38.png

model_ft即为含训练好参数的残差网络,num_ftrs = model_ft.fc.in_features 最后一个全连接的输入维度,这里实为512。

model_ft.fc = nn.Linear(num_ftrs, 2) # 将最后一个全连接由(512, 1000)改为(512, 2) 因为原网络是在1000类的ImageNet数据集上训练的。

adf6215cbbffc56b29203b975a4485c1.png

CPU上需要大约15-25分钟。但是在GPU上,它只需不到一分钟。

ConvNet as fixed feature extractor

将conv的参数都固定,只调整全连接。

e6a52e341416d7390ab1982edb93c83c.png

param.requires_grad = False# 将所有参数求导设为否

需要注意的是:新构建的model的参数默认为 requires_grad=True !

训练结果比全局调优还好一些。



推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • 如何使用Python从工程图图像中提取底部的方法?
    本文介绍了使用Python从工程图图像中提取底部的方法。首先将输入图片转换为灰度图像,并进行高斯模糊和阈值处理。然后通过填充潜在的轮廓以及使用轮廓逼近和矩形核进行过滤,去除非矩形轮廓。最后通过查找轮廓并使用轮廓近似、宽高比和轮廓区域进行过滤,隔离所需的底部轮廓,并使用Numpy切片提取底部模板部分。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
author-avatar
媣栺葒尘_383
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有