对应《深度学习入门:基于 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