一、图像识别流程
-
数据加载和预处理
-
将数据向量化
在Keras自带的MNIST数据集中,图片信息已经处理过了,我们只需要对标签进行向量化。
将标签向量化有两种方法:可以将标签列表转换为整数张量,或者使用 one-hot 编码。one-hot编码即将每个标签表示为全零向量, 只有标签索引对应的元素为 1。
在本次实验中使用的是one-hot编码:
pythondef one_hot_encode(self, labels): one_hot_labels = np.zeros((len(labels), self.num_classes)) for i, label in enumerate(labels): one_hot_labels[i, label] = 1 return one_hot_labels
-
-
构建模型
在构建神经网络模型时,需要关注四要素:
- 层:多个层组成网络(或模型)
- 输入数据及相应的目标
- 损失函数:用于学习的反馈信号
- 优化器:决定学习的过程如何进行
-
编译模型
在编译模型时,需要指定损失函数、优化器和监控指标。
inimodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
-
训练模型
在训练模型时,将输入数据和对应的标签传入模型中进行训练。可以指定训练的批次大小(batch size)和训练的轮数(epochs)。
inimodel.fit(input_data, one_hot_encoded_labels, epochs=epochs, batch_size=batch_size)
-
评估模型的性能
- 记录模型在验证集上的性能指标(比如准确率),找出那些能够提高性能的超参数设置。
- 使用组合的超参数设置重新训练模型,并在验证集上测试性能。选择那些性能最好的超参数组合作为最终设置。
二、不同的分类器之间的区别
常见的图像分类模型主要有以下几种:
- Softmax回归(Logistic回归):最简单的线性分类器,直接在最后一层使用softmax激活函数进行多分类。
- SVM(支持向量机):构建超平面将不同类别尽可能分开,使间隔最大化。非线性SVM可以通过核技巧进行非线性分类。
- 决策树和随机森林:通过学习决策规则对样本进行分类,树模型对异常值比较敏感。
- K近邻(KNN):根据测试样本在特征空间里与最近的训练样本的类别进行分类。
- 神经网络:包含卷积神经网络(CNN)、全连接网络等,通过多层非线性结构提取特征和分类。
主要的区别在于:
-
使用场景不同
根据数据集的特点,可以将问题分为线性可分的和非线性可分的。不同的类型自然也对应不同的分类器。
- 线性可分问题: 逻辑回归、线性支持向量机等线性分类器适用于线性可分数据集,即可以通过一条直线(或超平面)将不同类别的样本完全分开。
- 非线性可分问题: 决策树、随机森林、非线性支持向量机、神经网络等非线性分类器适用于非线性可分数据集,即类别之间的边界不是线性的,需要使用曲线或复杂的边界进行划分。
- 而对于高维数据集,例如文本、图像等,神经网络等复杂分类器通常更具优势,因为它们可以学习到高维特征之间的复杂关系。
-
在模型中使用的损失函数和优化算法不同
-
对于二分类问题:
- Softmax回归:交叉熵损失函数
- SVM:hinge loss
- 逻辑回归:对数损失函数
-
对于多分类问题:
- Softmax回归:交叉熵损失函数
- KNN: 不需要显式定义损失函数
- 决策树:基尼系数、信息增益等指标
- 神经网络:交叉熵损失函数
-
-
鲁棒性和泛化能力
不同分类器在处理噪声和缺失数据、对特征的敏感性、泛化能力等方面有所差异。例如,决策树对噪声和缺失数据相对较鲁棒,而神经网络在大规模数据上具有很强的泛化能力。
三、使用不同的更新方法优化神经网络
常见的损失函数:
- 均方损失(MSE)
其中f是模型的预测值,y是样本的真实值。MSE常用与回归任务中。
- 交叉熵损失
- 二分类交叉熵损失函数
- 多分类交叉熵损失函数
其中n是样本数目,m是分类数。
交叉熵损失常用于分类任务中。
常见的优化器:
-
梯度下降算法
-
随机梯度下降法(SGD)
每次随机从样本集中抽取一个样本对θ进行更新,更新公式为:
-
-
批量梯度下降法 (BGD)
每次随机从样本集中抽取M(batch_size)个样本进行迭代,迭代公式为:
-
小批量梯度下降法(Mini-batch GD)
在算法的每一步,从具有M个样本的训练集(已经打乱样本的顺序)中随机抽出一小批量进行迭代,迭代公式为:
-
梯度优化算法
动量算法:动量优化方法引入物理学中的动量思想,加速梯度下降,有Momentum和Nesterov两种算法。
-
Momentum
参数更新时在一定程度上保留之前更新的方向,同时又利用当前batch的梯度微调最终的更新方向。
引入动量的具体方式是:通过计算梯度的指数加权平均数来积累之前的动量,进而替代真正的梯度。Momentum的优化函数的权重更新公式如下:
- NAG
如果说Momentum算法是用一阶指数平滑,那么NGA算法则是使用了二阶指数平。Momentum算法类似用已得到的前一个梯度数据对当前梯度进行修正(类似一阶马尔科夫假设),NGA算法类似用已得到的前两个梯度对当前梯度进行修正(类似二阶马尔科夫假设),无疑后者得到的梯度更加准确,因此提高了算法的优化速度。
-
自适应学习率优化算法
由于篇幅原因,这里只列举Adam算法。
Adam本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。它的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
其公式为:
其中:
公式1是对梯度的一阶矩估计,用于得到带有动量的梯度值;
公式2是对梯度的二姐矩阵估计,用于得到每个权重参数的学习率权重参数; 公式3,4是对一阶二阶矩估计的校正。可以看出,直接对梯度的矩估计对内存没有额外的要求,而且可以根据梯度进行动态调整。
公式5是对学习率n形成的一个动态约束,而且有明确的范围。
-
正则化方法
在使用神经网络时,为了防止过拟合, 进而增强泛化能力,一种常见的降低过拟合的方法就是强制让模型权重只能取较小的值,从而限制模型的复杂度,这使得权重值的分布更加规则。这种方法叫作权重正则化,其实现方法是向网络损失中添加与较大权重值相关的成本(cost)。
- L1正则化:添加的成本与权重系数的绝对值(权重的L1范数)成正比。
- L2正则化:添加的成本与权重系数的平方(权重的L2范数)成正比。
-
Dropout正则化
L1、L2正则化是通过修改损失函数来实现的,而Dropout则是通过修改神经网络本身来实现的,它是在训练网络时用的一种trick。
对某一层使用 dropout,就是在训练过程中随机将该层的一些输出特征舍弃(设置为 0)。
dropout 比率(dropout rate)是被设为 0 的特征所占的比例,通常在 0.2~0.5 范围内。测试时没有单元被舍弃,而该层的输出值需要按 dropout 比率缩小,因为这时比训练时有更多的单元被激活,需要加以平衡。