从零实现的猫狗识别神经网络调整输出层后学习速度过慢原因问询
可能的原因如下:
- 损失函数与输出层不匹配
你之前单神经元输出做猫/非猫二分类时,搭配的是sigmoid激活+二元交叉熵损失;改为2神经元输出后,需要对应切换为softmax激活+多分类交叉熵损失,如果没有修改损失函数,会导致损失计算错误、梯度反向传播异常,网络无法学习。你给出的初始损失为1.386(恰好是2*ln2的数值),正好对应两个类别初始预测概率均为0.5时的交叉熵损失,全程损失几乎没有变化,符合损失函数不匹配的特征。 - 标签编码错误
单输出二分类时你使用的应该是0、1的单值标签,切换为2神经元输出后,需要将标签转换为one-hot编码格式(比如猫对应[1,0]、狗对应[0,1]),如果仍然传入单值标签计算交叉熵,会得到错误的梯度值,导致网络参数几乎不更新。 - 输出层激活函数未修改
如果你更换输出层神经元数量后,没有将输出层的激活函数从sigmoid改为softmax,2个神经元的输出不是合法的概率分布,交叉熵损失计算得到的梯度也是错误的,会直接导致网络学不动。 - 预处理步骤遗漏
可以检查猫狗分类任务的数据集是否和之前的猫分类任务做了相同的归一化处理,比如像素值是否从0-255缩放到了0-1区间,如果遗漏了归一化,会导致梯度过小,参数更新速度极慢。 - 输出层权重初始化异常
如果修改输出层时,新的输出层权重初始化数值过小,会导致初始梯度几乎为0,参数长时间没有有效更新。
内容的提问来源于stack exchange,提问作者Ramish Siddique
相关产品推荐
相关产品推荐

