Keras交通停止标志检测模型训练报No gradients provided错误
报错原因
- 核心原因:数据集构造错误,未提供训练对应的标签数据。你当前仅导入了图像输入,没有给每个样本标注对应的真实标签(比如包含停止标志为1,不包含为0),模型计算损失时无法获取标签来反向传播计算梯度,直接触发该报错。
- 额外问题:你当前的数据集里只有停止标志的正样本,没有不包含停止标志的负样本,就算加上标签也没法完成二分类任务,模型无法学习区分两类样本。
- 次要问题:二分类sigmoid输出使用MSE损失不是最优选择,容易出现梯度饱和的问题,但这不是本次报错的诱因。
解决方案
- 第一步:调整数据集结构。新增负样本(不包含停止标志的交通场景图像),将train和valid文件夹分别修改为二级目录结构:train下新建
stop(放停止标志正样本)、no_stop(放负样本)两个文件夹,valid目录同理创建对应的两个分类文件夹。 - 第二步:使用Keras内置接口自动加载带标签的数据集,代码示例:
ds_train = keras.utils.image_dataset_from_directory( './train', image_size=(128, 128), batch_size=32, label_mode='binary' ) ds_valid = keras.utils.image_dataset_from_directory( './valid', image_size=(128, 128), batch_size=32, label_mode='binary' )
- 第三步:优化损失函数配置,替换为更适配二分类任务的二元交叉熵,提升训练收敛效果:
model.compile( loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'] )
- 第四步:重新执行训练逻辑即可正常运行。
内容的提问来源于stack exchange,提问作者Kamil
相关产品推荐
相关产品推荐

