softmax手动实现+详细注释(动手学深度学习笔记)

训练结果(20个epoch 学习率0.1)

可以看出在10epoch的时候就基本开始过拟合了
过于硬核的手动实现
由于李沐老师的softmax手动实现部分较为硬核,自己刚入门不久啃起来有些麻烦,过程中尝试自己写时也踩了不少坑,因此加了十分详尽的注释,帮助大家一起理解代码,共同学习!
此外还重写了一些方法,没有使用到老师的d2l库,个人感觉主要难点还是将python语法与算法实现相结合,一方面关注算法本身的逻辑,另一方面也要注意如何使用python实现
老师的代码封装的比较好,但很多地方的实现过于抽象,需要深入理解
读取数据集并创建dataloader
展平图像与初始化参数
视为28*28=784的向量,故输入是784,由于数据集有10个类别,所以网络输出维度是10
定义softmax算符
这里要掌握张量计算的方法
当调⽤sum运算符时,我们可以指定保持在原始张量的轴数,⽽不折叠求和的维度,如对(3,2)进行按列求和,会得到(2,),设置keepdim为True就是(1,2)即一行,分别是两列的和
定义模型
1. 例如batch_size=256,则X这里是(256,784)代表256张图片 每个图片有28x28个像素(被展平成784)
2. 权重矩阵为(784,10)代表对每种输出的各特征权重
3. 因此256x784@784x10==256x10 即每张图片会输出十个类别的置信度,如衣服20% T恤60%……大衣5%,对十个输出会加上一个bias,通过广播机制作用到所有图片
定义交叉熵损失
交叉熵只在意真实值的预测概率,因此这里是抽取每一行对应是真实类别的预测概率的那个值,拿出来求负对数
例如第一个样本应该是2类(设共三类,从0-2),并预测概率是0.7,第二个样本应该是1类,预测是1类概率为0.5,则交叉熵损失为
计算accuracy
(accuracy无法作为损失函数所以我们引入交叉熵,但最后还是通过accuracy来看我们预测如何)
1. argmin/argmax 可以指定axis 返回最小或最大元素的索引下标(从0开始)
2. type 更改张量的dtype类型
3. sum将True相加(因为True代表1,求和相当于计算是True的个数)
评估在任意模型上的准确率
回归训练
分类预测
结果
最后
后续会考虑边跟老师课多发笔记,希望可以降低大家debug的时间,和大家共同进步!