1D CNN多分类训练报ValueError: Can not squeeze dim[1]错误如何解决
错误产生原因
该错误核心是标签张量的形状和模型输出张量的形状不匹配,具体触发点有两个:
- 你的标签
y_train、y_test被处理为(样本数, 8, 1)的三维结构,但模型最后一层用softmax输出的是(样本数, 8)的二维张量,使用categorical_crossentropy损失时,Keras会自动尝试挤压多余维度,维度匹配逻辑冲突触发报错。 - 后续调用
predict_classes得到的预测结果是形状为(样本数,)的类别索引序列,和三维结构的真实标签无法匹配计算分类指标,也会触发同类维度错误。
解决方法
按顺序执行以下两步修改即可:
- 调整标签形状,去掉多余的最后一维
修改你原有的标签reshape代码,删除最后一维的定义:
# 原有错误代码 # y_train= y_train.reshape(12279,8,1) # y_test=y_test.reshape(6049,8,1) # 替换为以下代码 y_train = y_train.reshape(12279, 8) y_test = y_test.reshape(6049, 8)
如果不想修改reshape逻辑,也可以直接调用squeeze方法删除最后一维:
y_train = y_train.squeeze(axis=-1) y_test = y_test.squeeze(axis=-1)
- 调整分类指标计算逻辑
因为你的标签是独热编码格式,而predict_classes输出的是类别索引,需要先把真实标签转换为类别索引再计算指标:
# 原有错误代码 # recall = recall_score(y_test, y_pred, average='macro') # precision = precision_score(y_test, y_pred, average='macro') # f1 = f1_score(y_test, y_pred, average='macro') # 替换为以下代码 y_true = np.argmax(y_test, axis=1) recall = recall_score(y_true, y_pred, average='macro') precision = precision_score(y_true, y_pred, average='macro') f1 = f1_score(y_true, y_pred, average='macro')
内容的提问来源于stack exchange,提问作者ubuntu_noob
相关产品推荐
相关产品推荐

