TensorFlow报错:sparse_categorical_crossentropy下logits与labels维度不匹配
解决TensorFlow中“logits and labels must have the same first dimension”错误
错误原因
你用pd.get_dummies把取值1-5的Score标签转换成了独热编码格式(形状为(样本数量, 5)),但sparse_categorical_crossentropy损失函数的设计目标是处理整数索引格式的标签(形状为(样本数量,),每个值是1-5的整数)。两者维度不匹配,就触发了这个错误。
两种解决方法
方法一:更换损失函数为categorical_crossentropy
独热编码标签对应categorical_crossentropy损失函数,直接修改模型编译代码:
model.compile( optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'] )
- 若模型最后一层使用了
softmax激活,直接用上述代码即可; - 若最后一层未加激活函数,需在损失函数中指定
from_logits=True:loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True)
方法二:将独热编码标签转回整数索引格式
放弃pd.get_dummies的独热编码处理,直接使用原始的Score值,或者把已生成的独热编码转成整数索引:
# 假设独热编码标签存储在df['one_hot_labels']列,转回整数索引 labels = df['one_hot_labels'].idxmax(axis=1) # 或者直接使用原始的Score列(无需转换为0开始的索引,sparse_categorical_crossentropy支持1-5的类别) labels = df['Score'].values
之后继续使用sparse_categorical_crossentropy作为损失函数即可。
额外注意
模型最后一层的Dense单元数必须设置为5(对应1-5共5个类别),例如:
model.add(Dense(5, activation='softmax'))
内容的提问来源于stack exchange,提问作者Raptor
相关产品推荐
相关产品推荐

