You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:00:53