训练softmax分类器实例_作业:softmax.ipynb

这个作业与svm.ipynb类似,要求:

  1. 为类Softmax分类器实现一个全向量化运算的损失函数 。类Softmax分类器定义在linear_classifier.py中,而损失函数实现在 softmax.py文件中。
  2. 实现一个基于微分分析梯度法的全向量化运算表达式(包含在损失函数定义中)。
  3. 与数值梯度法求出的损失函数和梯度值进行比较。
  4. 使用校验数据集来调节学习速率和正则化强度两个超参数。
  5. 使用SGD方法来优化损失函数
  6. 将最终学习到的权重集可视化。

在svm和softmax作业中都只讲了1和2的实现,强调公式推导和算法的性能优化(主要是使用向量化运算),并没有对一些辅助性功能及运行结果作说明。这篇文章补上这部分内容。

在softmax_loss_naive和 softmax_loss_vectorized 完成后,要求对两个函数的运行时间进行对比,在我的MBA上,前者运行时间是后者的14倍。

接下来是对softmax进行训练,并找到最优的超参数。下面的代码是留空处应该补全的代码:

for 

这里对学习速度和正则化惩罚强度两个超参数各给出了两组数据:

learning_rates 

由于精度问题,#01行处的代码会将1e-7显示为零。当正则化惩罚强度参数为1e8时,在我的MBA和python 2.7上运行出错:

Trying learning rate as 0.000000, regularization strength as 100000000.000000
reg penalty is 1530787.678522
iteration 0 / 1500: loss 1530793.446178
iteration 100 / 1500: loss nan
iteration 200 / 1500: loss nan
iteration 300 / 1500: loss nan
iteration 400 / 1500: loss nan

出现数值溢出,导致loss取值为非数字(nan, Not a number)。这是因为当强度参数取值为1e8时,正则化惩罚达到 1530787,不光远远超过loss的基本值,也会传递给第二次参与计算的权重集W,从而最终导致在sum(W*W)的计算中溢出。

最后一段代码揭示了经过学习而得的权重集W在本质上应该是什么:W中的每一个分类对应的数值(维度为D的数组,D = 32 * 32 * 3),本质是就是这个分类中所有图像的像素值的综合,因而将它还原成图像后,你会发现它就是它所代表的分类的图像。在我的机器上,经过训练后的W图形化后的结果如下:

e4dda7f58a57bf4a248bb6bc94fc50c5.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值