如何为1D CNN准备输入数据 解决输入维度不匹配报错问题
1D CNN输入适配及报错修复方案
报错核心原因
Keras的Conv1D层要求输入为3维张量,维度格式为(样本数, 序列长度/时间步长, 单位置特征数),你当前生成的数据集X维度为(样本数, 2),属于2维张量,缺少最后一个单位置特征维度,因此触发维度不匹配报错。
具体修改步骤
第一步:调整数据集维度
仅需要给原数据集新增最后一个维度即可适配输入要求,代码如下:
X, y = create_data(df) # 新增最后一维,将形状从(样本数,2)转换为(样本数,2,1),匹配Conv1D输入格式要求 X = np.expand_dims(X, axis=-1) Tx, Testx, Ty, Testy = train_test_split(X,y,train_size=0.8)
你查询资料看到的timestep(时间步)概念不需要局限在时间序列场景:1D CNN的本质是提取一维序列的局部关联特征,只要你的特征是固定顺序排列的一维向量,向量的长度就是timestep的数值。你当前固定按[Taste, Look]排列的2个特征,长度为2,对应timestep=2,最后新增的维度值为1,代表每个序列位置只有1个数值特征。
第二步:修正模型卷积参数
你当前设置的第一个Conv1D卷积核大小为3,而你的序列长度仅为2,卷积核尺寸大于序列长度会触发新的报错,需要同步调整卷积参数,这里给出适配你当前数据的可用模型参考:
def create_model(): model = Sequential() # 卷积核大小改为2,适配长度为2的序列 model.add(Conv1D(128,2,input_shape=(2,1),activation='relu')) model.add(BatchNormalization()) model.add(Flatten()) model.add(Dense(64,activation='relu')) model.add(Dense(1,activation='relu')) return model
如果后续你新增了更多特征,序列长度提升到大于3之后,你可以恢复原来的卷积核、池化层配置。
内容的提问来源于stack exchange,提问作者DevDog
相关产品推荐
相关产品推荐

