面部表情识别(FER)系统训练报错修复求助
面部表情识别训练报错解决方案
核心问题诊断
从输出和报错信息来看,三个关键问题导致训练失败:
- 训练集与测试集类别数量不匹配:训练集仅包含5类,但模型最后一层输出维度设为7类,测试集同样是7类,这会让交叉熵损失计算时出现维度不匹配,直接触发
InvalidArgumentError。 - Adam优化器参数过时:
lr和decay参数在新版Keras/TensorFlow中已被弃用,会抛出警告。 steps_per_epoch和validation_steps设置错误:硬编码了视频中的28709,但实际训练集只有15991张图片,该数值会导致训练时尝试读取不存在的数据。
具体修复步骤
1. 统一数据集类别数量
检查data/train文件夹,确保其中包含7个类别文件夹(对应7种表情,如愤怒、厌恶、恐惧、快乐、悲伤、惊讶、中性),与测试集类别完全一致。若训练集缺少类别,要么补充对应类别的数据,要么将模型最后一层输出数量调整为5(需同步修改测试集类别数量,不推荐此方案)。
2. 修正Adam优化器参数
将过时的参数替换为新版支持的写法:
emotion_model.compile(loss='categorical_crossentropy', optimizer=Adam(learning_rate=0.0001, weight_decay=1e-6), metrics=['accuracy'])
3. 动态计算训练步数
用数据集实际样本数自动计算步数,避免硬编码:
# Train the neural network/model emotion_model_info = emotion_model.fit( train_generator, steps_per_epoch=train_generator.samples // train_generator.batch_size, epochs=10, validation_data=validation_generator, validation_steps=validation_generator.samples // validation_generator.batch_size)
额外建议
- 训练前可打印
train_generator.class_indices和validation_generator.class_indices,确认两个数据集的类别顺序与数量完全一致,避免类别映射不匹配问题。 - 若数据集确实只有5类,需将模型最后一层的
Dense(7, activation='softmax')修改为Dense(5, activation='softmax'),同时确保测试集同步调整为5类。
内容的提问来源于stack exchange,提问作者Lanza
相关产品推荐
相关产品推荐

