欢迎光临散文网 会员登陆 & 注册

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

2023-07-31 03:53 作者:風神ねこ  | 我要投稿

训练结果(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,则交叉熵损失为

-log(0.5)%20%E4%B8%8E-log(0.7)

计算accuracy

(accuracy无法作为损失函数所以我们引入交叉熵,但最后还是通过accuracy来看我们预测如何)

1. argmin/argmax 可以指定axis 返回最小或最大元素的索引下标(从0开始)

2. type 更改张量的dtype类型

3. sum将True相加(因为True代表1,求和相当于计算是True的个数)

评估在任意模型上的准确率

回归训练

分类预测

结果

最后

后续会考虑边跟老师课多发笔记,希望可以降低大家debug的时间,和大家共同进步!

softmax手动实现+详细注释(动手学深度学习笔记)的评论 (共 条)

分享到微博请遵守国家法律