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

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

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

在完成这个项目的过程当中,我和其余学员同样,都碰到了各类问题和挑战,所以写下了这篇文章。但愿你读完这篇文章之后,会对你的机器学习有所裨益。python

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

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

加载一个预训练网络架构

“重用”是一个很是合理的策略,特别是当某些工具是你们都承认为标准的时候,“重用”更显得尤其重要。在这个例子中,咱们的出发点是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.特征层的输出和自定义分类器的输入大小必须相匹配。

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

原文连接

相关文章
相关标签/搜索