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

用PyTorch创建一个图像分类器?So easy!(Part 1)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

摘要: 本文将为你介绍为何要重用神经网络?哪部分可以重用,哪部分不可以重用。了解完这些基础概念,你就可以自行创建一个图像分类器了。

经过了几个月的学习和实践,我完成了优达学城网站上《Python Programming with Python Nanodegree》课程的学习,该课程的终极项目就是使用Pytorch为102种不同类型的花创建一个图像分类器。

在完成这个项目的过程中,我和其他学员一样,都碰到了各种问题和挑战,因此写下了这篇文章。希望你读完这篇文章以后,会对你的机器学习有所裨益。

本文介绍了如何实现图像分类的基础概念,即理解图像内容的算法。本文并不会详细分步说明构建模型的具体步骤,而是从宏观上介绍整个过程,如果你正在学习机器学习或人工智能,相信这篇文章将会对你很有帮助。

在第一部分中,我们将介绍加载预训练的神经网络,为什么要“重用”网络(即使用预训练神经网络),指明哪些部分可以重用,哪些部分不可以重用,以及如何自定义预训练网络。

加载一个预训练网络

“重用”是一个非常合理的策略,特别是当某些工具是大家都认可为标准的时候,“重用”更显得尤为重要。在这个例子中,我们的出发点是torchvision提供的一个模型框架。

现在,我们要做的是加载一个预先训练好的网络,并用自己的网络替换它的分类器,然后,我们就可以训练自己的分类器了。

虽然这个想法很合理,但是也比较麻烦,因为加载一个预先训练好的网络,并不会节省我们训练分类器的工作量。

所以,使用预训练网络到底有什么好处呢?

当我们人类在看图像的时候,我们会识别线条和形状,鉴于此,我们才可以将图像内容与之前看到的内容联系起来。现在,我们希望分类器也能做到这点,但是,图像并不是一个简单的数据,而是由数千个独立的像素组成,每个像素又由3个不同的值组合起来,形成颜色,即红色、绿色和蓝色。

从左到右,依次为:原始图像,红色,绿色,蓝色。

如果我们希望分类器能够处理这些数据,我们要做的就是将每个待处理图像所包含的信息,以分类器可以理解的格式传给分类器,这就是预训练网络发挥作用的地方。

这些预训练网络主要由一组特征检测器和分类器组成,其中,特征检测器被训练成可以从每个图像中提取信息,分类器被训练成理解特征层提供的输入。

在这里,特征检测器已经在ImageNet中接受过训练,并且性能良好,我们希望这点能够继续保持。在训练分类器时,为了防止特征层被篡改,我们得对特征层进行“冻结”,下面这些代码可以很轻松的解决这一问题:

for param in model.parameters():
    param.requires_grad = False

那么,问题又来了,既然我们可以“重用”特征检测器,我们为什么不能“重用”分类器?要回答这个问题,我们先来看看VGG16架构的默认分类器:

(classifier): Sequential(
  (0): Linear(in_features=25088, out_features=4096, bias=True)
  (1): ReLU(inplace)
  (2): Dropout(p=0.5)
  (3): Linear(in_features=4096, out_features=4096, bias=True)
  (4): ReLU(inplace)
  (5): Dropout(p=0.5)
  (6): Linear(in_features=4096, out_features=1000, bias=True)
)

 

首先,我们没办法保证这些代码能够起作用,在我们特定的环境中,这些默认层、元素、激活函数以及Dropout值并不一定是最佳的。

尤其是最后一层的输出是1000个元素,这就容易理解了。在我们的例子中,我们要对102种不同类型的花进行分类,因此,我们的分类器输出必须是102,而不是1000

从上面VGG16架构的默认分类器中,我们还可以注意到,分类器的输入层有25088个元素,这是特定预训练模型中特征检测器的输出大小,因此,我们的分类器大小也必须要与要特征层的输出相匹配
结论

从上面的分析,本文能够得到以下结论:

1.预先训练好的网络非常有用。使用预训练模型,可以让我们更加专注于我们自己用例的具体细节,还可以重用众所周知的工具,对用例中的图像进行预处理。

2.分类器的输出大小必须与我们希望识别的图像数量相同。

3.特征层的输出和自定义分类器的输入大小必须相匹配。

在下一篇文章中,我们将深入探讨,在训练分类器过程中,如何避免一些常见的陷阱,并学习如何调整超参数,来提高模型的准确性。

原文链接

转载于:https://my.oschina.net/u/1464083/blog/2990361

相关文章:

  • 【Leetcode】Path Sum II
  • docker学习笔记
  • 3、开启debug调试模式
  • 为什么BAT公司使用微服务架构,资深架构师来告诉你原因!
  • mysql学习【第4篇】:数据库之数据类型
  • python字典操作总结
  • hadoop Hive(9)
  • 启动和测试oracle是否安装成功
  • Java初始化顺序
  • linux 生成随机密码
  • 线程创建
  • 测者的测试技术手册:智能化测试框架EvoSuite的一个坑以及填坑方法
  • cookie和session
  • Android EditText控件自动转换大小写,光标位置不跳位
  • Android aidl Binder框架浅析
  • JavaScript 基本功--面试宝典
  • js中forEach回调同异步问题
  • Protobuf3语言指南
  • Python_网络编程
  • select2 取值 遍历 设置默认值
  • uni-app项目数字滚动
  • Vue全家桶实现一个Web App
  • 坑!为什么View.startAnimation不起作用?
  • 每天一个设计模式之命令模式
  • 前嗅ForeSpider中数据浏览界面介绍
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • mysql面试题分组并合并列
  • 整理一些计算机基础知识!
  • ​Java并发新构件之Exchanger
  • #define、const、typedef的差别
  • #etcd#安装时出错
  • #include到底该写在哪
  • (1)Android开发优化---------UI优化
  • (39)STM32——FLASH闪存
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (六)激光线扫描-三维重建
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • .NET Core 项目指定SDK版本
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .netcore 获取appsettings
  • 。Net下Windows服务程序开发疑惑
  • @Autowired 与@Resource的区别
  • @SuppressWarnings(unchecked)代码的作用
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [CSS]中子元素在父元素中居中
  • [daily][archlinux][game] 几个linux下还不错的游戏
  • [Deepin 15] 编译安装 MySQL-5.6.35
  • [Flex] PopUpButton系列 —— 控制弹出菜单的透明度、可用、可选择状态