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

基于TensorFlow Keras的1D CNN分类报错:输入维度不兼容求助

解决1D CNN输入维度不兼容问题及实现分类预测

错误原因

Conv1D层要求输入为3维张量,格式是(batch_size, sequence_length, input_channels),你的输入目前是2维(batch_size, 31),缺少了代表特征通道的维度(这里单通道设为1即可)。

修正步骤及完整代码

1. 调整输入数据维度

对训练集、测试集以及预测数据添加通道维度,将2维数据转为3维:

import numpy as np
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, LayerNormalization, GlobalAveragePooling1D, Flatten, Dense

# 假设raw_data和predict_data_raw是已加载的DataFrame
X = raw_data[feature_names].values  # 转为numpy数组
y = raw_data['Conditions'].values

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=22, test_size=0.1)

# 添加通道维度:(样本数, 特征数, 通道数)
X_train = X_train.reshape((X_train.shape[0], X_train.shape[1], 1))
X_test = X_test.reshape((X_test.shape[0], X_test.shape[1], 1))

# 预测数据同样处理
P = predict_data_raw[feature_names].values.reshape((-1, len(feature_names), 1))
P1 = predict_data_raw[feature_names1].values.reshape((-1, len(feature_names1), 1))

2. 修正模型编译的损失函数

针对二分类任务,根据标签类型选择合适损失函数:

  • 如果标签是整数形式(比如0/1),用sparse_categorical_crossentropy
  • 如果标签是one-hot编码(比如[1,0]/[0,1]),用categorical_crossentropy

修正后的模型定义与编译:

model = Sequential()
model.add(Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=(31, 1)))  # 明确输入形状
model.add(LayerNormalization())
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(LayerNormalization())
model.add(GlobalAveragePooling1D())
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(2, activation='softmax'))

# 假设标签是整数形式,用sparse_categorical_crossentropy
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

3. 训练模型并获取预测结果

# 训练模型
model.fit(X_train, y_train, epochs=20, batch_size=32, validation_split=0.1)

# 评估测试集
test_loss, test_acc = model.evaluate(X_test, y_test)

# 获取预测类别(0或1)
y_pred = model.predict(X_test).argmax(axis=1)

# 获取每个样本的两类预测概率(第一列是类别0的概率,第二列是类别1的概率)
y_probs = model.predict(X_test)

# 对预测数据P、P1执行同样操作
p_pred = model.predict(P).argmax(axis=1)
p_probs = model.predict(P)

p1_pred = model.predict(P1).argmax(axis=1)
p1_probs = model.predict(P1)

关键说明

  • 给输入添加通道维度是解决维度不兼容的核心,因为1D CNN需要明确“序列特征+通道”的结构
  • 损失函数必须匹配标签格式,否则会出现新的报错
  • GlobalAveragePooling1D已经会输出2维张量,后续的Flatten()可以省略(不影响结果,但冗余)

内容的提问来源于stack exchange,提问作者Vui Chee Chang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:45:36