搭建卷积神经网络时拟合出现维度不匹配ValueError,寻求解决方案
卷积神经网络model.fit()维度不匹配报错解决
问题概述
搭建卷积神经网络时,执行model.fit()触发维度不匹配错误,相关信息如下:
数据形状
- X_train: (555, 224, 224, 3)
- X_test: (99, 224, 224, 3)
- y_train: (555, 4)
- y_test: (99, 4)
- X_val: (116, 224, 224, 3)
- y_val: (116, 4)
代码片段
from keras.layers import Conv2D, AveragePooling2D, MaxPooling2D, Flatten, Dense, Concatenate, Input from keras import Model # 定义模型输入 input_ = Input(shape=(224, 224, 3)) # 第一个并行分支 in_1 = Conv2D(filters=16, kernel_size=(3, 3), activation='relu', padding='same')(input_) conv_1 = BatchNormalization()(in_1) conv_1 = AveragePooling2D(pool_size=(2, 2), strides=(3, 3))(conv_1) # 第二个并行分支 in_2 = Conv2D(filters=16, kernel_size=(5, 5), activation='relu', padding='same')(input_) conv_2 = BatchNormalization()(in_2) conv_2 = AveragePooling2D(pool_size=(2, 2), strides=(3, 3))(conv_2) # 第三个并行分支 in_3 = Conv2D(filters=16, kernel_size=(5, 5), activation='relu', padding='same')(input_) conv_3 = BatchNormalization()(in_3) conv_3 = MaxPooling2D(pool_size=(2, 2), strides=(3, 3))(conv_3) # 第四个并行分支 in_4 = Conv2D(filters=16, kernel_size=(9, 9), activation='relu', padding='same')(input_) conv_4 = BatchNormalization()(in_4) conv_4 = MaxPooling2D(pool_size=(2, 2), strides=(3, 3))(conv_4) # 拼接分支 concat = Concatenate()([conv_1, conv_2, conv_3, conv_4]) flat = Flatten()(concat) out = Dense(units=4, activation='softmax')(flat) # 编译模型 from tensorflow.keras.optimizers import Adam model.compile( optimizer = Adam(learning_rate=0.00001), loss='categorical_crossentropy', metrics=['accuracy'] ) model1 = model.fit(X_train, y_train, validation_data = (X_val, y_val), epochs = 100, batch_size=batch_size # callbacks=[es_callback] )
报错信息
ValueError: 维度必须匹配,但在节点'Equal'中分别为4和224,输入形状为: [?,4], [?,224,224]
问题原因及修复方案
核心原因
代码中仅定义了模型的输入层和输出层,但未通过Model()类创建完整的模型实例,导致model变量指向的并非预期的神经网络模型(可能是之前定义的某个层对象),最终引发模型输出与标签维度不匹配的错误。
修复步骤
- 补全模型创建代码:在定义完输出层
out后,添加以下代码创建完整模型:
model = Model(inputs=input_, outputs=out)
- 补充缺失的导入:代码中使用了
BatchNormalization但未导入,需在开头的导入语句中添加:
from keras.layers import Conv2D, AveragePooling2D, MaxPooling2D, Flatten, Dense, Concatenate, Input, BatchNormalization
- 定义batch_size变量:代码中使用了
batch_size但未赋值,需提前设置具体数值,例如:
batch_size = 32
修复后的完整模型定义与编译部分如下:
# 拼接分支 concat = Concatenate()([conv_1, conv_2, conv_3, conv_4]) flat = Flatten()(concat) out = Dense(units=4, activation='softmax')(flat) # 创建完整模型实例(关键缺失代码) model = Model(inputs=input_, outputs=out) # 编译模型 from tensorflow.keras.optimizers import Adam batch_size = 32 model.compile( optimizer = Adam(learning_rate=0.00001), loss='categorical_crossentropy', metrics=['accuracy'] )
内容的提问来源于stack exchange,提问作者Rezuana Haque
相关产品推荐
相关产品推荐

