使用sparse_categorical_crossentropy训练Keras模型时出现InvalidArgumentError
问题解决:InvalidArgumentError 标签值超出范围
错误根源
- 最后一层激活函数误用:
Dense(1, activation='softmax')完全不符合需求,softmax用于多分类场景(输出维度等于类别数),当输出维度为1时,softmax的结果永远是1,无法实现分类区分。 - 损失函数与任务不匹配:
sparse_categorical_crossentropy是为多分类任务设计的(类别数≥2,标签为整数索引),但你需要的是单输出分类,两者不兼容,直接导致标签值1超出[0,1)的错误提示。
修正方案(适配单输出二分类任务)
针对你希望生成单个输出的需求,调整模型的最后一层和损失函数即可解决问题:
修正后的完整代码
model = Sequential() model.add(Dense(32, input_dim=x_train.shape[1], activation='relu')) model.add(Dropout(0.25)) model.add(Dense(128, activation='relu')) model.add(Dropout(0.25)) model.add(Dense(32, activation='relu')) model.add(Dropout(0.25)) model.add(Dense(8, activation='relu')) model.add(Dropout(0.25)) # 将softmax替换为sigmoid,适配二分类单输出场景 model.add(Dense(1, activation='sigmoid')) # 将损失函数替换为binary_crossentropy,匹配二分类任务 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(x_train, y_train, epochs=10, batch_size=64) print("Generate predictions") predictions = model.predict(x_train[:1]) print(x_train.shape) print(predictions) print("predictions shape:", predictions.shape)
关键改动说明
- 激活函数改为sigmoid:sigmoid会将输出压缩到0-1区间,代表样本属于正类(标签1)的概率,完全符合单输出二分类的需求。
- 损失函数改为binary_crossentropy:该损失专门用于二分类任务,与sigmoid激活函数搭配,能正确计算0/1标签下的损失值。
额外检查
确保y_train中的标签值仅包含0和1两种,没有其他超出范围的数值,否则仍会触发类似错误。
内容的提问来源于stack exchange,提问作者tang
相关产品推荐
相关产品推荐

