You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Keras中使用自定义Precision指标时出现ValueError报错

解决Keras二分类中实例化Precision(class_id=1)触发维度越界的问题

报错原因

你的模型采用sigmoid激活函数,输出形状为(batch_size, 1),仅输出正类的概率值,没有单独的负类概率维度。当你指定class_id=1时,Keras会尝试从模型输出的第1个维度(索引1)切片获取该类的预测结果,但你的输出只有1个维度(索引0),因此触发"维度1的切片索引1越界"的错误。

而使用字符串metrics=['Precision']时,Keras会自动适配二分类场景,默认计算正类的精度,无需手动指定class_id。

解决方案

方案1:保持二分类sigmoid输出,使用默认Precision实例

直接去掉class_id参数,Keras会自动处理二分类场景的精度计算:

from keras.models import Sequential
from keras.layers import Dense, Dropout
import numpy as np

model = Sequential()
model.add(Dense(90, input_dim=900, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(90, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

m = keras.metrics.Precision()  # 移除class_id参数
X_train = np.eye(900)
Y_train = np.ones((900, 1))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=[m])
model.fit(X_train, Y_train, epochs=50, batch_size=1000)

方案2:改为多分类输出格式(适合需明确指定class_id的场景)

如果必须使用class_id=1,需要将模型输出改为2维(对应两个类别),采用softmax激活,同时将标签转换为one-hot编码:

from keras.models import Sequential
from keras.layers import Dense, Dropout
import numpy as np

model = Sequential()
model.add(Dense(90, input_dim=900, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(90, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dense(2, activation='softmax'))  # 输出2个类别的概率

m = keras.metrics.Precision(class_id=1)
X_train = np.eye(900)
Y_train = np.ones((900, 1))
# 将标签转换为one-hot格式
Y_train = np.eye(2)[Y_train.astype(int).flatten()]

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=[m])
model.fit(X_train, Y_train, epochs=50, batch_size=1000)

内容的提问来源于stack exchange,提问作者Ejaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:39:35