cs231n训练营学习笔记(6)

跑代码,softmax

最开始,写softmax_loss_naive用循环求loss和gradient

softmax分类器使用交叉熵loss,公式为

编程实现时候稍微利用了广播,10个分数一起算的

for i in range(num_train):
    scores = X[i].dot(W)
    scores -= max(scores)#避免溢出
    scores = np.exp(scores) / np.sum(np.exp(scores))
    loss += - np.log(scores[y[i]])

 为什么初始计算出来的loss约等于0.1

因为初始W约等于0,按照公式计算,相当于e^{0}/\sum e^{0}=1/10

求导计算上面的公式,得到梯度,过程很多,但是最后基本上都约掉了

  if j == y[i]:
        dW[:,j] += (qj - 1) * X[i]
      else:
        dW[:,j] += qj * X[i]

qj是log里面那部分

接下来向量化

  scores = X.dot(W)
  scores -= np.max(scores, axis=1, keepdims=True)
  scores = np.exp(scores) / np.sum(np.exp(scores), axis=1, keepdims=True)
  dW = np.copy(scores)
  dW[range(num_train),y] -= 1
  dW = X.T.dot(dW)
  
  loss -= np.log(scores[range(num_train),y])
  loss = np.sum(loss)

这里注意:dW[range(num_train),y]和dW[:,y]并不一样,shape分别是(500,) 和(500, 500)

第一种是每次是第i行和y[i]构成元组,取dW[i,y[i]],第二种是所有行和y[i]

剩下的部分和svm类似

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值