目录
摘要
输出层的反向传播和实现
摘要
本篇文章继续学习尚硅谷深度学习教程,学习内容是输出层的反向传播和代码实现
输出层的反向传播和实现
在输出层,我们一般使用Softmax作为激活函数。
对于Softmax函数:
其偏导数为:
而对于输出层,一般会直接将结果代入损失函数的计算。对于我们之前介绍的分类问题,这里选择交叉熵误差(Cross Entropy Error)作为损失函数,就可以得到一个Softmax-with-Loss层,它包含了Softmax和Cross Entropy Loss两部分。
导数的计算会比较复杂,可以用计算图表示如下:
简化得:
在代码中可以实现为一个类 SoftmaxWithLoss:
class SoftmaxWithLoss: def __init__(self): self.loss = None self.y = None # softmax的输出 self.t = None # 监督数据 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] if self.t.size == self.y.size: # 监督数据是one-hot-vector的情况 dx = (self.y - self.t) / batch_size else: dx = self.y.copy() dx[np.arange(batch_size), self.t] -= 1 dx = dx / batch_size return dx