迁移学习

迁移学习是一种机器学习的方法,指的是一个预训练的模型被重新用在另一个任务中,它专注于存储已有问题的解决模型,并将其利用在其他不同但相关问题上。例如我在A的场景下训练了一个模型,而B、C、D等场景与A类似,那么我们就可以把A的模型使用在这些类似场景上,A中的工作相当于做了预训练了。很多情况下迁移学习能够简化或降低模型构建的难度,节省训练时间、硬件消耗等,甚至还能取得不错的准确度。

Pytorch VGG16迁移学习实战

torchvision 包含流行的数据集、模型架构和用于计算机视觉的常见图像转换。因此我们调用VGG16这个图像领域的网络模型时,会用到torchvision来调用

首先需要调用torchvision中的models,通过models调用vgg16

from torchvision import models
model = models.vgg16(pretrained=True)

下图官方文档中对vgg16_bn的描述,pretrained=True即会返回一个预训练好的模型,VGG16在ImageNet上是224*224,之后只要将自己数据集中调整到符合vgg16要求即可了,同样也要注意vgg16的输出,因为它是基于ImageNet训练的,所以输出会是一个1000维的向量,之后就可以使用该模型做预测了,或者进行微调和二次训练。

函数vgg16_bn与函数vgg16的唯一区别在于vgg16_bn中添加了batch_normalization

网络结构调整

这里以二分类为例,我们需要将原先1000维的输出调整为2维。

为避免不必要的训练消耗,将参数的自动梯度设为false

for parma in model.parameters():  # 设置自动梯度为falseparma.requires_grad = False

首先我们先输出一下vgg16的网络结构

model._modules

<bound method Module.named_modules of VGG(
(features): Sequential(
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace=True)
(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace=True)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(6): ReLU(inplace=True)
(7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(8): ReLU(inplace=True)
(9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(11): ReLU(inplace=True)
(12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(13): ReLU(inplace=True)
(14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(15): ReLU(inplace=True)
(16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(18): ReLU(inplace=True)
(19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(20): ReLU(inplace=True)
(21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(22): ReLU(inplace=True)
(23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(25): ReLU(inplace=True)
(26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(27): ReLU(inplace=True)
(28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(29): ReLU(inplace=True)
(30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(avgpool): AdaptiveAvgPool2d(output_size=(7, 7))
(classifier): Sequential(
(0): Linear(in_features=25088, out_features=4096, bias=True)
(1): ReLU(inplace=True)
(2): Dropout(p=0.5, inplace=False)
(3): Linear(in_features=4096, out_features=4096, bias=True)
(4): ReLU(inplace=True)
(5): Dropout(p=0.5, inplace=False)
(6): Linear(in_features=4096, out_features=1000, bias=True)
)
)>

可以看到最终的分类在classifier中,关键层是classifier[6],那我们就修改它

model.classifier[6] = nn.Linear(in_features=4096, out_features=2)

修改后梯度计算会恢复为默认的True,可以用同样的方法去冻结某个层参数的梯度计算以及修改模型中某一层的结构

参考

https://blog.csdn.net/weixin_43199584/article/details/105190965

Pytorch实现迁移学习相关推荐

  1. pytorch之迁移学习

    文章目录 1.导入相关的包 2.加载数据 3.可视化部分图像数据 4.训练模型 5.可视化模型的预测结果 6.场景1:微调ConvNet 7.场景2:ConvNet作为固定特征提取器 实际中,基本没有 ...

  2. 使用PyTorch进行迁移学习

    概述 迁移学习可以改变你建立机器学习和深度学习模型的方式 了解如何使用PyTorch进行迁移学习,以及如何将其与使用预训练的模型联系起来 我们将使用真实世界的数据集,并比较使用卷积神经网络(CNNs) ...

  3. Pytorch 的迁移学习的理解

    个人理解,迁移学习可以分为三类: 第一类:以训练好的模型参数为基础,对所有参数进行继续优化. 即,先在别的训练数据集上训练模型,达到一定训练标准之后,用当前的数据集继续进行训练. 第二类:将已经训练好 ...

  4. Resnet152对102种花朵图像分类(PyTorch,迁移学习)

    目录 1.介绍 1.1.项目数据及源码 1.2.数据集介绍 1.3.任务介绍 1.4.ResNet网络介绍 2.数据预处理 3.展示数据 4.进行迁移学习 4.1.训练全连接层 4.2.训练所有层 5 ...

  5. 【PyTorch】迁移学习:基于 VGG 实现的光明哨兵与破败军团分类器

    文章目录 简述. 环境配置. PyTorch代码. 导入第三方库. 使用 GPU. 加载数据. 定义可视化函数. 加载预训练模型. 冻结特征层. 修改输出层. 定义优化器. 定义训练函数. 训练过程. ...

  6. pytorch添加迁移学习

    # 参数设置(指定用第几轮的预训练权重) parser = argparse.ArgumentParser(description="PyTorch Net") parser.ad ...

  7. PyTorch迁移学习

    PyTorch迁移学习 实际中,基本没有人会从零开始(随机初始化)训练一个完整的卷积网络,因为相对于网络,很难得到一个足够大的数据集[网络很深, 需要足够大数据集].通常的做法是在一个很大的数据集上进 ...

  8. PyTorch基础(六)迁移学习

    在实际工程中,基本没有人会从零开始(随机初始化)训练一个完整的卷积网络,因为相对于网络,很难得到一个足够大的数据集(网络很深,需要足够大数据集).通常的做法是在一个很大的数据集上进行预训练得到卷积网络 ...

  9. 【Pytorch实战6】一个完整的分类案例:迁移学习分类蚂蚁和蜜蜂(Res18,VGG16)

    参考资料: <深度学习之pytorch实战计算机视觉> Pytorch官方教程 Pytorch官方文档 本文是采用pytorch进行迁移学习的实战演练,实战目的是为了进一步学习和熟悉pyt ...

最新文章

  1. 网站下载器WebZip、Httrack及AWWWB.COM网站克隆器
  2. matlab溢出的标志inf,关于C#:溢出与信息
  3. webpack Entrypoint undefined = index.html
  4. 工信部制定VR行业标准-谋定研究:对话中国经济和信息化
  5. HADOOP_MAPRED_ROOT_LOGGER has been replaced by HADOOP_ROOT_LOGGER
  6. php添加gd库,linux下为php添加GD库(重新编译php)
  7. Solr 中 Schema 结构说明
  8. 粒子群对函数的优化 matlab,编译通过
  9. 机器学习 深度学习 ai_人工智能,机器学习和深度学习。 真正的区别是什么?...
  10. 从yesno模型入门kaldi语音识别
  11. winform5、高清屏下字体模糊的解决方法
  12. 腾讯会议共享屏幕 共享PPT视频声音
  13. mysql程序设计考试app_MySQL数据库设计与应用知到APP期末考试完整答案
  14. kali安装最新版nessus
  15. 优思学院|精益生产的前世今生
  16. Onlyoffice安装教程
  17. Java后端社招面试经历,不愧是大佬
  18. springboot支付宝APP支付与退款
  19. 多无线路由器AP使用同一个SSID号无缝连接漫游
  20. OGC入门学习专栏(2.1) - SWE通用数据模型编码标准(写完所有小节再合)

热门文章

  1. java 怎么做卷积运算,入门教程之算法系列(二):卷积运算与模糊操作
  2. 2019美亚杯团队赛
  3. [51CTO学院三周年]+一个巴士阿叔和Linux不得不說的故事
  4. CCF CSP 202209-4 吉祥物投票【并查集+Set维护段】
  5. 用Gurobi+python求解设施选址问题(facility location)
  6. perfectscrollbar 多个_Microsoft向Office365添加了8000多个免版税图片
  7. 打造金融科技银行,招行的底气源自……
  8. 算法设计与分析 屈婉玲教授(第三章)
  9. MPC学习笔记(1)——原理
  10. videojs播放监控