AI入门 | 图像分类

一、图像识别流程

  1. 数据加载和预处理

    • 将数据向量化

      在Keras自带的MNIST数据集中,图片信息已经处理过了,我们只需要对标签进行向量化。

      将标签向量化有两种方法:可以将标签列表转换为整数张量,或者使用 one-hot 编码。one-hot编码即将每个标签表示为全零向量, 只有标签索引对应的元素为 1。

      在本次实验中使用的是one-hot编码:

      python 复制代码
      def 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
  2. 构建模型

    在构建神经网络模型时,需要关注四要素:

    • 层:多个层组成网络(或模型)
    • 输入数据及相应的目标
    • 损失函数:用于学习的反馈信号
    • 优化器:决定学习的过程如何进行
  3. 编译模型

    在编译模型时,需要指定损失函数、优化器和监控指标。

    ini 复制代码
    model.compile(optimizer='adam',
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
  4. 训练模型

    在训练模型时,将输入数据和对应的标签传入模型中进行训练。可以指定训练的批次大小(batch size)和训练的轮数(epochs)。

    ini 复制代码
    model.fit(input_data, one_hot_encoded_labels, epochs=epochs, batch_size=batch_size)
  5. 评估模型的性能

    • 记录模型在验证集上的性能指标(比如准确率),找出那些能够提高性能的超参数设置。
    • 使用组合的超参数设置重新训练模型,并在验证集上测试性能。选择那些性能最好的超参数组合作为最终设置。

二、不同的分类器之间的区别

常见的图像分类模型主要有以下几种:

  • Softmax回归(Logistic回归):最简单的线性分类器,直接在最后一层使用softmax激活函数进行多分类。
  • SVM(支持向量机):构建超平面将不同类别尽可能分开,使间隔最大化。非线性SVM可以通过核技巧进行非线性分类。
  • 决策树和随机森林:通过学习决策规则对样本进行分类,树模型对异常值比较敏感。
  • K近邻(KNN):根据测试样本在特征空间里与最近的训练样本的类别进行分类。
  • 神经网络:包含卷积神经网络(CNN)、全连接网络等,通过多层非线性结构提取特征和分类。

主要的区别在于:

  • 使用场景不同

    根据数据集的特点,可以将问题分为线性可分的和非线性可分的。不同的类型自然也对应不同的分类器。

    • 线性可分问题: 逻辑回归、线性支持向量机等线性分类器适用于线性可分数据集,即可以通过一条直线(或超平面)将不同类别的样本完全分开。
    • 非线性可分问题: 决策树、随机森林、非线性支持向量机、神经网络等非线性分类器适用于非线性可分数据集,即类别之间的边界不是线性的,需要使用曲线或复杂的边界进行划分。
    • 而对于高维数据集,例如文本、图像等,神经网络等复杂分类器通常更具优势,因为它们可以学习到高维特征之间的复杂关系。
  • 在模型中使用的损失函数和优化算法不同

    • 对于二分类问题:

      • Softmax回归:交叉熵损失函数
      • SVM:hinge loss
      • 逻辑回归:对数损失函数
    • 对于多分类问题:

      • Softmax回归:交叉熵损失函数
      • KNN: 不需要显式定义损失函数
      • 决策树:基尼系数、信息增益等指标
      • 神经网络:交叉熵损失函数
  • 鲁棒性和泛化能力

    不同分类器在处理噪声和缺失数据、对特征的敏感性、泛化能力等方面有所差异。例如,决策树对噪声和缺失数据相对较鲁棒,而神经网络在大规模数据上具有很强的泛化能力。

三、使用不同的更新方法优化神经网络

常见的损失函数:

  1. 均方损失(MSE)

其中f是模型的预测值,y是样本的真实值。MSE常用与回归任务中。

  1. 交叉熵损失
  • 二分类交叉熵损失函数
  • 多分类交叉熵损失函数

其中n是样本数目,m是分类数。

交叉熵损失常用于分类任务中。

常见的优化器:

  1. 梯度下降算法

    • 随机梯度下降法(SGD)

      每次随机从样本集中抽取一个样本对θ进行更新,更新公式为:

  • 批量梯度下降法 (BGD)

    每次随机从样本集中抽取M(batch_size)个样本进行迭代,迭代公式为:

  • 小批量梯度下降法(Mini-batch GD)

    在算法的每一步,从具有M个样本的训练集(已经打乱样本的顺序)中随机抽出一小批量进行迭代,迭代公式为:

  1. 梯度优化算法

    动量算法:动量优化方法引入物理学中的动量思想,加速梯度下降,有Momentum和Nesterov两种算法。

  • Momentum

    参数更新时在一定程度上保留之前更新的方向,同时又利用当前batch的梯度微调最终的更新方向。

    引入动量的具体方式是:通过计算梯度的指数加权平均数来积累之前的动量,进而替代真正的梯度。Momentum的优化函数的权重更新公式如下:

  • NAG

如果说Momentum算法是用一阶指数平滑,那么NGA算法则是使用了二阶指数平。Momentum算法类似用已得到的前一个梯度数据对当前梯度进行修正(类似一阶马尔科夫假设),NGA算法类似用已得到的前两个梯度对当前梯度进行修正(类似二阶马尔科夫假设),无疑后者得到的梯度更加准确,因此提高了算法的优化速度。

  1. 自适应学习率优化算法

    由于篇幅原因,这里只列举Adam算法。

    Adam本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。它的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。

    其公式为:

其中:

公式1是对梯度的一阶矩估计,用于得到带有动量的梯度值;

公式2是对梯度的二姐矩阵估计,用于得到每个权重参数的学习率权重参数; 公式3,4是对一阶二阶矩估计的校正。可以看出,直接对梯度的矩估计对内存没有额外的要求,而且可以根据梯度进行动态调整。

公式5是对学习率n形成的一个动态约束,而且有明确的范围。

  1. 正则化方法

    在使用神经网络时,为了防止过拟合, 进而增强泛化能力,一种常见的降低过拟合的方法就是强制让模型权重只能取较小的值,从而限制模型的复杂度,这使得权重值的分布更加规则。这种方法叫作权重正则化,其实现方法是向网络损失中添加与较大权重值相关的成本(cost)。

  • L1正则化:添加的成本与权重系数的绝对值(权重的L1范数)成正比。
  • L2正则化:添加的成本与权重系数的平方(权重的L2范数)成正比。
  • Dropout正则化

    L1、L2正则化是通过修改损失函数来实现的,而Dropout则是通过修改神经网络本身来实现的,它是在训练网络时用的一种trick。

    对某一层使用 dropout,就是在训练过程中随机将该层的一些输出特征舍弃(设置为 0)。

    dropout 比率(dropout rate)是被设为 0 的特征所占的比例,通常在 0.2~0.5 范围内。测试时没有单元被舍弃,而该层的输出值需要按 dropout 比率缩小,因为这时比训练时有更多的单元被激活,需要加以平衡。

相关推荐
肥猪猪爸28 分钟前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
readmancynn40 分钟前
二分基本实现
数据结构·算法
萝卜兽编程42 分钟前
优先级队列
c++·算法
盼海1 小时前
排序算法(四)--快速排序
数据结构·算法·排序算法
LZXCyrus1 小时前
【杂记】vLLM如何指定GPU单卡/多卡离线推理
人工智能·经验分享·python·深度学习·语言模型·llm·vllm
一直学习永不止步1 小时前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
我感觉。1 小时前
【机器学习chp4】特征工程
人工智能·机器学习·主成分分析·特征工程
YRr YRr1 小时前
深度学习神经网络中的优化器的使用
人工智能·深度学习·神经网络
DieYoung_Alive1 小时前
一篇文章了解机器学习(下)
人工智能·机器学习
夏沫的梦1 小时前
生成式AI对产业的影响与冲击
人工智能·aigc