Keras训练CNN时报ValueError: An operation has `None` for gradient如何解决
问题根因
你代码中对Softmax层的参数使用错误,是触发梯度None报错的直接原因。
你写的输出层代码为:
out = keras.layers.Softmax(3)(fc)
Keras中Softmax层的第一个入参是axis,代表沿哪个张量维度计算概率分布。而你前面的Dense(3)层输出的张量形状为(batch_size, 3),只有2个维度(索引分别为0对应batch维度、1对应类别维度),你指定axis=3对应维度不存在,会导致计算逻辑异常,梯度无法正常反向传播,最终触发报错。
修复方案
二选一即可:
- 修正Softmax层的维度参数,使用
axis=-1自动沿张量最后一个维度计算,适配性更强:out = keras.layers.Softmax(axis=-1)(fc) - 直接将softmax激活合并到全连接层中,简化代码:
# 删掉单独的Softmax层,修改Dense层代码如下 fc = keras.layers.Dense(3, activation='softmax', kernel_initializer='he_uniform')(fc)
其他排查项
如果修改后仍有报错,可以检查以下内容:
- 检查训练/验证输入特征、独热编码标签是否存在NaN、无穷大等非法值
- 确认使用的Keras版本为稳定正式版,部分旧版本对无效参数的容错性更低
内容的提问来源于stack exchange,提问作者Jong Hyeok Lee
相关产品推荐
相关产品推荐

