清华大学驭风计划课程链接
学堂在线 - 精品在线课程学习平台 (xuetangx.com)
代码和报告均为本人自己实现(实验满分),只展示任务实验结果,如果需要报告或者代码可以私聊博主
有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~
Softmax实现手写数字识别
相关知识点: numpy科学计算包,如向量化操作,广播机制等
1 简介
本次案例中,你需要用python实现Softmax回归方法,用于MNIST手写数字数据集分类任务。你需要完成前向计算loss和参数更新。
你需要首先实现Softmax函数和交叉熵损失函数的计算。
![image.png](https://img-blog.csdnimg.cn/img_convert/19566eb65437448add9f5daff0ed92cd.png)
在更新参数的过程中,你需要实现参数梯度的计算,并按照随机梯度下降法来更新参数。
![image.png](https://img-blog.csdnimg.cn/img_convert/85e79355e4c3f7ba05a0aeabc2151441.png)
具体计算方法可自行推导
MNIST数据集
MNIST手写数字数据集是机器学习领域中广泛使用的图像分类数据集。它包含60,000个训练样本和10,000个测试样本。这些数字已进行尺寸规格化,并在固定尺寸的图像中居中。每个样本都是一个784×1的矩阵,是从原始的28×28灰度图像转换而来的。MNIST中的数字范围是0到9。下面显示了一些示例。
![image.png](https://img-blog.csdnimg.cn/img_convert/f27c2a6ff10ed22c599aa25a2ca5ce4c.png)
2. 要求
a) 记录训练和测试的准确率。画出训练损失和准确率曲线;
b) 比较使用和不使用momentum结果的不同,可以从训练时间,收敛性和准确率等方面讨论差异;
c) 调整其他超参数,如学习率,Batchsize等,观察这些超参数如何影响分类性能。写下观察结果并将这些新结果记录在报告中。
3.实验结果
a) 记录训练和测试的准确率 。 画出训练损失和准确率曲线;
这里是使用原始提供的代码画出的图像
![](https://img-blog.csdnimg.cn/direct/1adc2082935b4f2e905ee2b85bad8428.png)
b) 比较使用和不使用 momentum 结果的不同, 可以从训练时间, 收敛性和准确率等方面讨论差异;
训练时间
:达到相同准确率的情况下,使用动量的训练时间会更快,特别是陡峭的梯度
方向上,使得模型快速接近最优解附近。
收敛性
:不管使不使用动量都可以收敛,只不过使用动量后收敛会更快。
准确率
:为了看出差异我训练了
40
个周期,使用动量的优化算法有着更高的准确率,在
相同的训练周期可以看出使用了动量后准确率更高,即使在后期收敛正确率仍然有一定差距,
这说明使用动量容易跳出局部最优解。
c) 调整其他超参数 ,如学习率 ,Batchsize 等, 观察这些超参数如何影响分类性能 。
1,学习率
我把学习率分别调整为 1, 0.5, 0.1, 0.01, 0.001 这五个数值, 结果如下图所示
通过图像看出学习率为
0.1
的时候最优,拥有最高的正确率,学习率为
1
的时候发生震荡现
象,因此为
1
的时候学习率过大。当学习率为
0.001
的时候发现收敛速度过慢,可能需要更
多的迭代次数才能达到较高准确率。
2 ,Batchsize
![](https://img-blog.csdnimg.cn/direct/9f95f616753648d29db46bf61908fd13.png)
![](https://img-blog.csdnimg.cn/direct/8570be4b13e342eeba5629c4ff1cb319.png)
小批量大小:
优点:小批量大小可以更频繁地更新参数,使模型更快地收敛,并且可能对小数据集更加合
适。
缺点:小批量大小可能会导致参数更新方向的噪声较大,可能使模型在训练过程中表现不稳
定,特别是在
GPU
训练时可能导致性能下降。
大批量大小:
优点:大批量大小可以减少参数更新的噪声,使参数更新更加稳定,特别是在大数据集上可
能更有效。
缺点:大批量大小可能会导致内存消耗增加,特别是在
GPU
上可能会出现内存不足的问题,
此外,可能需要更多的迭代次数才能收敛。
通过图像看出批量大小在
100
的时候结果最好
批量大小为
10
的时候震动较大,对梯度下降方向不明确
批量大小为
1000
和
2500
的时候,准确率上升过慢,个人认为是更新过少导致
批量大小为
500
时候也有不错的效果但是和批量大小
100
比仍然有一定差距。
3 ,max_epoch
通过查阅资料我发现有种叫做 (
EarlyStopping
) 早停法的方法可以找到最优
max_epoch
,我在
solver.py
里面根据
trian
函数写出了
trian_EarlyStoppingfang
函数可以实现早停法,核心代码如下
其余部分和原代码一样
通过对容忍度的调整,发现等于
2
的时候也就是
2
个周期准确度没有提升
0.02
以上就停止
训练,结果最优为
0.9223(在尽量少训练时间的情况下)
|