Softmax-with-Loss层反向传播的值除以批的大小

对应《深度学习入门:基于 Python 的理论与实现》153页最后一段落

class SoftmaxWithLoss:
 def __init__(self):
 	self.loss = None # 损失
 	self.y = None # softmax的输出
 	self.t = None # 监督数据(one-hot vector)
 	
 def forward(self, x, t):
	 self.t = t
	 self.y = softmax(x)
	 self.loss = cross_entropy_error(self.y, self.t)
 	return self.loss
 	
 def backward(self, dout=1):
 	batch_size = self.t.shape[0]
 	dx = (self.y - self.t) / batch_size#!!!!!!!!!!!!!!!!!!!!!看这里,dx是图中L对a的偏导
 	return dx

当时一直不懂为什么要除以batch_size,但大家看看下面这段书上的源码

这个是交叉熵的计算过程

def cross_entropy_error(y, t):
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
        
    # 监督数据是one-hot-vector的情况下,转换为正确解标签的索引
    if t.size == y.size:
        t = t.argmax(axis=1)
             
    batch_size = y.shape[0]
    return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size#!!!!看这里

也就是说,交叉熵的计算方式会根据输入数据的批数发生变化,因为最终交叉熵的结果是通过平均多个交叉熵而成的,即这是为了能够把一批数据看成一个数据,也方便对一批数据与一个数据的误差进行直接比较

当我只输入1个数据的时候,
交叉熵结果是-np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / 1

而如果我输入13个数据的时候
交叉熵结果是-np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / 13

在这里插入图片描述

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值