李沐-动手学深度学习-softmax回归的从零开始实现

就像我们从零开始实现线性回归一样,你应该知道实现softmax的细节。

和之前线性回归的例子一样,这里的每个样本都将用固定长度的向量表示。将展平每个图像,将它们视为长度为784的向量。因为我们的数据集有10个类别,所以网络输出维度为10。

在实现softmax回归模型之前,我们简要回顾一下sum运算符如何沿着张量中的特定维度工作。

回想一下,实现softmax由三个步骤组成

1. 对每个项求幂(使用exp);

2. 对每一行求和(小批量中每个样本是一行),得到每个样本的规范化常数;

3. 将每一行除以其规范化常数,确保结果的和为1。

 我们将每个元素变成一个非负数。此外,依据概率原理,每行总和为1。

注意,虽然这在数学上看起来是正确的,但我们在代码实现中有点草率。 矩阵中的非常大或非常小的元素可能造成数值上溢或下溢,但我们没有采取措施来防止这点。

 定义softmax操作后,我们可以实现softmax回归模型。 下面的代码定义了输入如何通过网络映射到输出。 注意,将数据传递到模型之前,我们使用reshape函数将每张原始图像展平为向量。

创建一个数据y_hat, 其中包含2个样本在3个类别的预测概率,使用y作为y_hat中概率的索引。

 实现交叉熵损失函数。

 将预测类别与真实y元素进行比较。当预测与标签分类y一致时,即是正确的。 分类精度即正确预测数量与总预测数量之比。 虽然直接优化精度可能很困难(因为精度的计算不可导), 但精度通常是我们最关心的性能衡量标准,我们在训练分类器时几乎总会关注它。使用argmax获得每行中最大元素的索引来获得预测类别。 然后我们将预测类别与真实y元素进行比较。 由于等式运算符“==”对数据类型很敏感, 因此我们将y_hat的数据类型转换为与y的数据类型一致。 结果是一个包含0(错)和1(对)的张量。 

 同样,对于任意数据迭代器data_iter可访问的数据集, 我们可以评估在任意模型net的精度。

 Accumulator实例中创建了2个变量,用于分别存储正确预测的数量和预测的总数量。这里定义一个实用程序类Accumulator,用于对多个变量进行累加。

 定义一个函数来训练一个迭代周期。 请注意,updater是更新模型参数的常用函数,它接受批量大小作为参数。Softmax回归的训练。

 定义一个在动画中绘制数据的实用程序类。

 训练函数

 从零开始实现,使用小批量梯度下降算法来优化损失函数模型,设置学习率为0.1。

训练模型10个迭代周期。迭代周期(num_epochs)和学习率(lr)都是可调节的超参数。 通过更改它们的值,我们可以提高模型的分类精度。

 

 现在训练已经完成,我们的模型已经准备好对图像进行分类预测。 给定一系列图像,我们将比较它们的实际标签(文本输出的第一行)和模型预测(文本输出的第二行)。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值