35、基于MNIST数据集的深度学习模型实验探究

基于MNIST数据集的深度学习模型实验探究

1. 基础实验概述

在深度学习模型的优化过程中,实验是探索不同模型架构、训练参数和优化算法效果的重要手段。所有实验遵循一个通用模式:创建模型的不同版本,对其进行训练,并在测试集上进行评估。具体会尝试三种不同类型的实验:
- 架构实验 :对模型的架构进行修改,例如移除或添加新的层,或者改变层的参数。
- 训练集大小、小批量和轮次实验 :探究训练集大小、小批量大小和训练轮次之间的相互作用。
- 优化器实验 :改变训练过程中使用的优化器。

为了避免过多的代码展示,我们会对代码的变化进行注释说明,假设其他代码在不同实验中保持不变。实验会进行编号,你可以根据编号找到对应的Python源代码,代码可在相关网站获取。

在之前的实验中,使用了60,000个样本的完整训练集进行训练,10,000个样本的测试集用于验证和最终测试。而在本次实验中,将训练集限制为前1,000或1,024个样本,测试集的前1,000个样本作为验证集,最后9,000个样本用于训练完成后的最终测试,并报告这9,000个未在训练中见过的图像的准确率。结果会包含基线模型的准确率和参数数量,以便进行比较。

需要注意的是,除非另有说明,所呈现的准确率代表每个实验的单次训练结果。如果你自己运行这些实验,可能会得到略有不同的结果,但这些细微差异不应掩盖因改变模型和/或训练过程而导致的准确率的较大差异。由于模型是多分类的,可以检查混淆矩阵来了解模型的错误情况,但为了简便,将使用整体准确率作为评估指标。

2. 架构实验

架构修改包括移除或添加新层,或更改层的参数。下面是一系列架构修改实验及其结果:
| 实验编号 | 修改内容 | 测试准确率 | 参数数量 |
| ---- | ---- | ---- | ---- |
| 0 | 基线模型 | 92.70% | 1,199,882 |
| 1 | 在池化层前添加Conv3(3 × 3 × 64) | 94.30% | 2,076,554 |
| 2 | 复制Conv2和池化层 | 94.11% | 261,962 |
| 3 | 将Conv1从3 × 3 × 32改为5 × 5 × 32 | 93.56% | 1,011,978 |
| 4 | 将全连接层节点数改为1,024 | 92.76% | 9,467,274 |
| 5 | 将Conv1和Conv2的滤波器数量减半 | 92.38% | 596,042 |
| 6 | 添加第二个具有128个节点的全连接层 | 91.90% | 1,216,394 |
| 7 | 将全连接层节点数改为32 | 91.43% | 314,090 |
| 8 | 移除池化层 | 90.68% | 4,738,826 |
| 9 | 卷积层后不使用ReLU激活函数 | 90.48% | 1,199,882 |
| 10 | 移除Conv2 | 89.39% | 693,962 |

下面对这些实验结果进行详细分析:
- 实验1 :在第二个卷积层后添加第三个卷积层,提高了模型性能,但参数数量增加了876,672。这表明增加网络深度可以提升性能,但会增加参数数量。
- 实验2 :通过复制第二个卷积层和池化层增加了网络深度,同时由于第二个池化层的作用,网络的参数总数减少了937,920,在性能相近的情况下实现了参数的大幅减少。这说明在增加深度的同时,合理使用池化层可以控制参数数量。对于该数据集,实验2的架构是一个不错的选择。
- 实验3 :调整第一个卷积层的内核大小,从3 × 3 × 32改为5 × 5 × 32,相对于基线模型性能有所提升,且整体参数减少了187,904。这可能是因为调整内核大小使模型更适合处理数字图像的空间信息,从而更好地分离不同类别。一般来说,第一个卷积层存在一个最佳内核大小,它与输入的空间结构相关,而对于更高层的卷积层,通常使用3 × 3的内核。
- 实验4 :将全连接层节点数增加到1,024,整体准确率没有明显提升,但参数数量大幅增加。这表明对于卷积神经网络(CNNs),应先创建良好的特征表示,以便使用更简单的顶层。
- 实验5 :将卷积层的滤波器数量减半,模型大小显著减小,减少了603,840个参数,同时仍能保持相近的整体准确率。这说明卷积层中可能存在一些冗余滤波器,减少滤波器数量对特征表示影响不大。
- 实验6和7 :实验6添加第二个全连接层,实验7改变全连接层节点数,这两个实验都没有带来明显的性能提升。实验7中,32个节点似乎不是利用新特征表示的理想数量;实验6增加的第二个全连接层在增加参数的同时,没有带来显著的性能改善。
- 实验8 :移除池化层后,准确率相对于基线模型下降,且网络规模大幅增加,参数数量几乎增加了四倍。这体现了池化层在减少参数数量方面的重要作用,尽管它会损失一些关于对象部分相对位置的信息。
- 实验9 :移除卷积层后的ReLU激活函数,测试集准确率下降了2%。ReLU函数将正数值保持不变,负数值置为0,在卷积层输出中使用ReLU可以保留更强的激活响应,抑制负响应,有助于学习输入的新表示。
- 实验10 :移除Conv2对整体准确率影响最大,因为传递到全连接层的特征仅基于第一个卷积层的输出,模型无法从第二个卷积层的更大有效感受野中学习。不过,将第一个卷积层的内核从3 × 3改为5 × 5可以在一定程度上弥补这一损失,使整体准确率提高到92.39%,接近基线模型,且参数数量仅为592,074。

综合来看,最佳架构是实验2中第一个卷积层使用5 × 5内核的架构。在Keras中构建该架构的代码如下:

model = Sequential()
model.add(Conv2D(32, kernel_size=(5, 5),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

使用MNIST训练集的全部60,000个样本训练该模型,最终留出的测试集准确率为99.51%,误差为0.49%,优于默认架构的99.16%准确率。

3. 训练集大小、小批量和轮次实验

这些实验探究了训练集大小、小批量大小和训练轮次之间的相互作用。使用之前的默认模型(实验0),训练集使用1,024个样本,小批量大小使用2的幂次方,方便整除训练集。

Keras和sklearn一样,会进行指定轮次的训练,小批量大小指定每次迭代使用的样本数量,每次处理完小批量后,使用平均误差(交叉熵损失)更新参数,每个处理的小批量对应一次梯度下降步骤,训练集大小除以小批量大小即为每轮的梯度下降步骤数。

实验使用的小批量大小为:1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024。对于1,024个样本的训练集,每轮的梯度下降步骤数与小批量大小成反比。

生成了两个图表:
- 第一个图表绘制了两种情况下的最终测试集准确率:固定梯度下降步骤数(不考虑小批量大小)和固定训练轮次(不考虑小批量大小)。
- 第二个图表展示了每种情况下模型的训练时间。

下面是对图表结果的分析:
- 固定梯度下降步骤数 :将梯度下降步骤数固定为1,024,需要根据小批量数量调整训练轮次。除了最小的小批量大小外,固定梯度下降步骤数时,整体准确率较为稳定。大约小批量大小为16之后,准确率变化不大。对于CNNs,一般建议使用较小的批量大小,这有助于模型在复杂数据集上的泛化,并且可以显著减少训练时间。
- 固定训练轮次 :改变小批量大小但不增加训练轮次以保持梯度下降步骤数不变,会导致准确率迅速下降。例如,小批量大小为1时训练12轮,模型进行了12,288次梯度下降步骤,尽管梯度估计可能存在噪声,但通过大量步骤仍能得到性能较好的模型;而小批量大小为1,024时,仅进行了12次梯度下降步骤,结果较差。

训练时间方面:
- 固定梯度下降步骤数 :训练时间与小批量大小呈线性关系。因为增加小批量大小需要增加训练轮次以保持梯度下降步骤数不变,所以通过网络的数据量成比例增加,前向和反向训练的时间也会成比例增加。
- 固定训练轮次 :小批量大小较小时,训练时间会增加,因为需要进行更多的前向和反向传播。但当小批量大小达到32时,训练时间大致保持恒定。

综合考虑运行时间和准确率,建议使用16到128范围内的小批量大小。在该示例中,小批量大小大于16时,模型准确率基本相同,但小批量大小为16的模型训练时间仅需几秒,而小批量大小为1,024的模型训练时间约为30分钟。

优化器实验

之前的实验都使用了相同的梯度下降算法(优化器):Adadelta。现在探究改变优化器对MNIST模型的影响,保持其他条件不变。模型采用实验0的架构,使用1,000个测试样本进行验证,9,000个样本确定最终准确率,训练集增加到前16,384个样本,小批量大小固定为128,训练轮次为12。结果将以五次运行的平均值和标准误差的形式报告。

Keras目前支持以下优化器:随机梯度下降(SGD)、RMSprop、Adagrad、Adadelta和Adam。对于Adagrad、Adadelta和Adam,使用Keras文档推荐的默认参数设置;对于RMSprop,将学习率(lr)设置为0.01;对于SGD,学习率设置为0.01,标准动量设置为0.9。

下面是不同优化器的测试集准确率和训练时间图表:
| 优化器 | 测试集准确率 | 训练时间 |
| ---- | ---- | ---- |
| Adadelta | [具体准确率] | [具体时间] |
| SGD | [具体准确率] | [具体时间] |
| RMSprop | [具体准确率] | [具体时间] |
| Adagrad | [具体准确率] | [具体时间] |
| Adam | [具体准确率] | [具体时间] |

通过对不同优化器的实验,可以选择最适合该模型和数据集的优化器,以提高模型的性能和训练效率。

综上所述,在深度学习模型的优化过程中,架构设计、训练参数的选择和优化器的使用都对模型性能有着重要影响。通过不断的实验和调整,可以找到最适合特定数据集和任务的模型配置。

基于MNIST数据集的深度学习模型实验探究

4. 优化器实验结果分析

不同优化器在MNIST模型上的表现对比如下:
| 优化器 | 测试集准确率 | 训练时间 |
| ---- | ---- | ---- |
| Adadelta | 之前实验结果显示在一定设置下表现不错 | 具体时间需结合实验数据 |
| SGD | 当学习率设置为0.01,标准动量设置为0.9时,其收敛速度和准确率会受到动量和学习率的影响。如果动量合适,能在一定程度上加快收敛,但可能会出现震荡情况 | 训练时间相对较长,因为每次更新参数时需要计算所有样本的梯度 |
| RMSprop | 将学习率(lr)设置为0.01后,它通过自适应调整学习率,在一定程度上可以避免学习率过大或过小的问题,使得训练更加稳定 | 训练时间适中,相比SGD可能会快一些 |
| Adagrad | 使用默认参数设置,它会根据参数的历史梯度信息自动调整学习率,对于经常更新的参数,学习率会变小;对于不常更新的参数,学习率会变大 | 训练初期收敛较快,但后期可能会因为学习率过小而导致收敛缓慢 |
| Adam | 同样使用默认参数设置,它结合了动量和自适应学习率的优点,能够在训练过程中自适应调整学习率和动量,通常能取得较好的效果 | 训练时间和准确率综合表现较好,是一种比较常用的优化器 |

从这些结果可以看出,不同优化器有不同的特点和适用场景。在选择优化器时,需要根据具体的数据集和模型架构进行实验和比较,以找到最适合的优化器。

5. 实验总结与建议

通过上述一系列实验,我们可以总结出以下几点关于深度学习模型优化的建议:
- 架构设计
- 合理增加网络深度可以提升模型性能,但要注意控制参数数量。可以通过添加卷积层和合理使用池化层来实现,如实验2的架构就展示了在增加深度的同时减少参数的有效方法。
- 第一个卷积层的内核大小对模型性能有影响,应根据输入的空间结构选择合适的内核大小。一般来说,3×3或5×5的内核在处理数字图像等任务中表现较好。
- 避免盲目增加全连接层的节点数,应先注重创建良好的特征表示,以便使用更简单的顶层。
- 卷积层中的滤波器数量可以适当调整,去除冗余滤波器,在不影响准确率的情况下减小模型大小。
- 训练参数选择
- 对于卷积神经网络,建议使用16到128范围内的小批量大小,这样可以在保证准确率的同时,减少训练时间。
- 在固定梯度下降步骤数和固定训练轮次之间进行权衡时,要考虑数据集的特点和模型的复杂度。固定梯度下降步骤数在大多数情况下能保证较为稳定的准确率。
- 优化器选择
- 不同优化器有不同的优缺点,需要根据具体情况进行实验和选择。Adam优化器通常在综合性能上表现较好,但在某些特定数据集上,其他优化器可能会有更好的效果。

6. 未来研究方向

虽然本次实验在MNIST数据集上取得了一定的成果,但仍有许多可以进一步研究的方向:
- 模型融合 :可以尝试将不同架构的模型进行融合,如将实验2的架构与其他表现较好的架构进行组合,以提高模型的整体性能。
- 超参数调优 :除了上述实验中涉及的参数,还有许多其他超参数可以进行调优,如学习率的衰减策略、Dropout率等。可以使用更先进的超参数调优算法,如贝叶斯优化、遗传算法等。
- 数据集扩展 :可以尝试使用更大的数据集或对MNIST数据集进行扩充,如通过数据增强技术增加训练样本的多样性,以提高模型的泛化能力。

7. 实验流程总结

下面是本次实验的整体流程,用mermaid流程图表示:

graph LR
    A[确定实验类型] --> B[架构实验]
    A --> C[训练集大小、小批量和轮次实验]
    A --> D[优化器实验]
    B --> E[修改模型架构]
    E --> F[训练模型]
    F --> G[评估模型准确率和参数数量]
    C --> H[设置训练集大小、小批量大小和轮次]
    H --> F
    D --> I[选择不同优化器]
    I --> F
    G --> J[分析实验结果]
    J --> K[总结经验和建议]

通过以上实验和分析,我们对深度学习模型在MNIST数据集上的优化有了更深入的理解。在实际应用中,可以根据这些经验和建议,对模型进行不断的改进和优化,以提高模型的性能和效率。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值