摘要: 学习完了如何加载预训练神经网络,下面就让咱们来看看如何训练分类器吧!html
在第一部分中,咱们知道了为何以及如何加载预先训练好的神经网络,咱们能够用本身的分类器代替已有神经网络的分类器。那么,在这篇文章中,咱们将学习如何训练分类器。node
训练分类器网络
首先,咱们须要为分类器提供待分类的图像。本文使用ImageFolder加载图像,预训练神经网络的输入有特定的格式,所以,咱们须要用一些变换来调整图像的大小,即在将图像输入到神经网络以前,对其进行裁剪和标准化处理。函数
具体来讲,将图像大小调整为224*224,并对图像进行标准化处理,即均值为 [0.485,0.456,0.406],标准差为[0.229,0.224,0.225],颜色管道的均值设为0,标准差缩放为1。学习
而后,使用DataLoader批量传递图像,因为有三个数据集:训练数据集、验证数据集和测试数据集,所以须要为每一个数据集建立一个加载器。一切准备就绪后,就能够训练分类器了。测试
在这里,最重要的挑战就是——正确率(accuracy)。3d
让模型识别一个已经知道的图像,这不算啥事,可是咱们如今的要求是:可以归纳、肯定之前从未见过的图像中花的类型。在实现这一目标过程当中,咱们必定要避免过拟合,即“分析的结果与特定数据集的联系过于紧密或彻底对应,所以可能没法对其余数据集进行可靠的预测或分析”。code
隐藏层htm
实现适当拟合的方法有不少种,其中一种很简单的方法就是:隐藏层。blog
咱们很容易陷入这样一种误区:拥有更多或更大的隐藏层,可以提升分类器的正确率,但事实并不是如此。
增长隐藏层的数量或大小之后,咱们的分类器就须要考虑更多没必要要的参数。举个例子来讲,将噪音看作是花朵的一部分,这会致使过拟合,也会下降精度,不只如此,分类器还须要更长的时间来训练和预测。
所以,我建议你从数量较少的隐藏层开始,而后根据须要增长隐藏层的数量或大小,而不是一开始就使用特别多或特别大的隐藏层。
在第一部分介绍的《AI Programming with Python Nanodegree》课程中的花卉分类器项目中,我只须要一个小的隐藏层,在第一个完整训练周期内,就获得了70%以上的正确率。
数据加强
咱们有不少图像可供模型训练,这很是不错。若是拥有更多的图像,数据加强就能够发挥做用了。每一个图像在每一个训练周期都会做为神经网络的输入,对神经网络训练一次。在这以前,咱们能够对输入图像作一些随机变化,好比旋转、平移或缩放。这样,在每一个训练周期内,输入图像都会有差别。
增长训练数据的种类有利于减小过拟合,一样也提升了分类器的归纳能力,从而提升模型分类的总体准确度。
Shuffle
在训练分类器时,咱们须要提供一系列随机的图像,以避免引入任何偏差。
举个例子来讲,咱们刚开始训练分类器时,咱们使用“牵牛花”图像对模型进行训练,这样一来,分类器在后续训练过程当中将会偏向“牵牛花”,由于它只知道“牵牛花”。所以,在咱们使用其余类型的花进行训练时,分类器最初的偏好也将持续一段时间。
为了不这一现象,咱们就须要在数据加载器中使用不一样的图像,这很简单,只须要在加载器中添加shuffle=true,代码以下:
trainloader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
Dropout
有的时候,分类器中的节点可能会致使其余节点不能进行适当的训练,此外,节点可能会产生共同依赖,这就会致使过拟合。
Dropout技术经过在每一个训练步骤中使一些节点处于不活跃状态,来避免这一问题。这样一来,在每一个训练阶段都使用不一样的节点子集,从而减小过拟合。
Dropout图
除了过拟合,咱们必定要记住,学习率( learning rate )是最关键的超参数。若是学习率过大,模型的偏差永远都不会降到最小;若是学习率太小,分类器将会训练的特别慢,所以,学习率不能过大也不能太小。通常来讲,学习率能够是0.01,0.001,0.0001……,依此类推。
最后,在最后一层选择正确的激活函数会对模型的正确率会产生特别大的影响。举个例子来讲,若是咱们使用 negative log likelihood loss(NLLLoss),那么,在最后一层中,建议使用LogSoftmax激活函数。
结论
理解模型的训练过程,将有助于建立可以归纳的模型,在预测新图像类型时的准确度更高。
在本文中,咱们讨论了过拟合将会如何下降模型的归纳能力,并学习了下降过拟合的方法。另外,咱们也强调了学习率的重要性及其经常使用值。最后,咱们知道,为最后一层选择正确的激活函数很是关键。
如今,咱们已经知道应该如何训练分类器,那么,咱们就能够用它来预测之前从未见过的花型了!