Keras训练分类网络报错ValueError: Dimensions must be equal维度不匹配
Keras图像分类维度不匹配问题修复方案
核心错误原因
报错由两个可修复的逻辑问题共同导致:
- 卷积池化后的4维特征张量未做展平,直接接入全连接层,导致模型输出形状和标签形状不匹配
- 损失函数选择和标签格式不兼容
具体修复步骤
1. 模型结构补充展平层
在Dropout(0.25)层和第一个全连接Dense层之间,添加keras.layers.Flatten()层,将卷积输出的(None,32,32,18)4维张量压缩为(None, 32*32*18)的一维特征向量,适配全连接层的输入要求。
修改后的模型结构代码:
inputs = keras.Input(shape=(64,64,1), dtype='float32') x = keras.layers.Conv2D(12,(9,9), padding="same", dtype='float32',activation='relu')(inputs) x = keras.layers.Conv2D(18,(7,7), padding="same", activation='relu')(x) x = keras.layers.MaxPool2D(pool_size=(2,2))(x) x = keras.layers.Dropout(0.25)(x) # 新增展平层 x = keras.layers.Flatten()(x) x = keras.layers.Dense(50, activation='relu')(x) x = keras.layers.Dropout(0.4)(x) outputs = keras.layers.Dense(2, activation='softmax')(x) model = keras.Model(inputs, outputs)
修改后模型输出形状会变为(None,2),和标签形状对齐。
2. 修正损失函数配置
你的标签y_train是one-hot编码格式(形状为(样本数, 2)),不能使用SparseCategoricalCrossentropy损失(仅支持整数标签,形状为(样本数,)),替换为CategoricalCrossentropy即可。
修改后的编译代码:
model.compile( loss=keras.losses.CategoricalCrossentropy(), optimizer=keras.optimizers.Adam(0.01), metrics=["acc"], )
可选优化
如果你的one-hot标签是通过to_categorical转换得到的,也可以保留SparseCategoricalCrossentropy损失,将标签转换为整数格式:
y_train = np.argmax(y_train, axis=1) y_test = np.argmax(y_test, axis=1)
内容的提问来源于stack exchange,提问作者nadia faramarzi
相关产品推荐
相关产品推荐

