CNN训练时模型形状不兼容问题:形状匹配错误排查与解决
问题:模型拟合时出现形状不兼容错误
数据集初始形状
print(X_train.shape) print(X_test.shape) print(y_train.shape) print(y_test.shape) ---------------------- (120000, 72) (12000, 72) (120000, 6) (12000, 6)
数据重塑操作
X_train = X_train.reshape(len(X_train), X_train.shape[1], 1) X_test = X_test.reshape(len(X_test), X_test.shape[1], 1) X_train.shape, X_test.shape ------------------------------------------------------------------- ((120000, 72, 1), (12000, 72, 1))
模型定义
def model(): model = Sequential() model.add(Conv1D(filters=64, kernel_size=6, activation='relu', padding='same', input_shape=(72, 1))) model.add(BatchNormalization()) # adding a pooling layer model.add(MaxPooling1D(pool_size=(3), strides=2, padding='same')) model.add(Conv1D(filters=64, kernel_size=6, activation='relu', padding='same', input_shape=(72, 1))) model.add(BatchNormalization()) model.add(MaxPooling1D(pool_size=(3), strides=2, padding='same')) model.add(Conv1D(filters=64, kernel_size=6, activation='relu', padding='same', input_shape=(72, 1))) model.add(BatchNormalization()) model.add(MaxPooling1D(pool_size=(3), strides=2, padding='same')) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dense(64, activation='relu')) model.add(Dense(3, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model
报错信息
model = model() model.summary() logger = CSVLogger('logs.csv', append=True) his = model.fit(X_train, y_train, epochs=30, batch_size=32, validation_data=(X_test, y_test), callbacks=[logger]) --------------------------------------------------------------- ValueError: Shapes (32, 6) and (32, 3) are incompatible
问题原因
- 模型输出层定义为
Dense(3, activation='softmax'),说明模型预期输出3类分类结果,对应形状为(batch_size, 3) - 但标签数据
y_train和y_test的形状是(120000, 6)和(12000, 6),对应6类分类,两者维度不匹配,导致损失计算时形状冲突
解决方法
根据实际分类需求,有两种修正方向:
方向1:实际为6类分类任务
修改模型输出层的神经元数量为6,匹配标签维度:
# 将最后一层Dense的3改为6 model.add(Dense(6, activation='softmax'))
方向2:实际为3类分类任务
需要将6维标签转换为3维,需结合数据含义调整标签编码:
import numpy as np import tensorflow as tf # 示例:假设原6维one-hot标签可按逻辑合并为3类(需根据实际数据调整映射规则) y_train_idx = np.argmax(y_train, axis=1) # 这里示例将0-1类合并为0,2-3类合并为1,4-5类合并为2 y_train_3class = y_train_idx // 2 y_train_3class = tf.keras.utils.to_categorical(y_train_3class, num_classes=3) # 测试集做同样转换 y_test_idx = np.argmax(y_test, axis=1) y_test_3class = y_test_idx // 2 y_test_3class = tf.keras.utils.to_categorical(y_test_3class, num_classes=3) # 使用新标签拟合模型 his = model.fit(X_train, y_train_3class, epochs=30, batch_size=32, validation_data=(X_test, y_test_3class), callbacks=[logger])
内容的提问来源于stack exchange,提问作者abcd1211231
相关产品推荐
相关产品推荐

