多变量时间序列二分类:Keras模型输入形状错误及数据重塑咨询
解决LSTM/Conv2D多变量时间序列分类的输入形状问题
嘿,我来帮你搞定这个输入形状的问题~首先咱们先搞清楚报错的根源:
你现在用的是Conv2D层,但你的输入X_train是3维张量:(100, 9000, 7)(样本数、时间步长、特征数),而Conv2D层要求的输入是4维张量:(样本数, 高度, 宽度, 通道数),这就是为什么会报“expected 4 dimensions, but got 3”的错误。
接下来分两种情况给你解决方案:
情况1:你确实想尝试用Conv2D处理时间序列
如果一定要用Conv2D,你需要给输入数据添加一个通道维度(因为时间序列可以看作单通道的二维数据)。用numpy的reshape就能轻松实现:
import numpy as np # 把(100, 9000, 7)重塑为(100, 9000, 7, 1) X_train = X_train.reshape((X_train.shape[0], X_train.shape[1], X_train.shape[2], 1)) X_test = X_test.reshape((X_test.shape[0], X_test.shape[1], X_test.shape[2], 1))
这样调整后,你的Conv2D层的input_shape=(9000,7,1)就和输入形状匹配了,训练时就不会报错啦。
情况2:你原本是想用LSTM做时间序列分类(更贴合你的需求)
既然你一开始的目标是用LSTM处理多变量时间序列二分类,那其实不该用Conv2D,LSTM本身就是为序列数据设计的,它接受的是3维输入:(样本数, 时间步长, 特征数),刚好就是你现在的X_train形状!
给你一个最简的LSTM二分类模型示例:
from keras.models import Sequential from keras.layers import LSTM, Dense # 构建模型 model = Sequential() # LSTM层:第一个参数是隐藏单元数(可根据需求调整),input_shape=(时间步长, 特征数) model.add(LSTM(32, input_shape=(9000, 7))) # 输出层:二分类用sigmoid激活函数,输出1个值(0或1) model.add(Dense(1, activation='sigmoid')) # 编译模型:二分类用binary_crossentropy损失函数,优化器选adam model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 直接训练,不需要调整输入形状 model.fit(x=X_train, y=Y_train, epochs=100, batch_size=4) # batch_size可根据内存调整
这里要额外提醒下:你的标签Y_train需要是形状为(100,)或者(100,1)的一维数组,确保是二分类的0/1标签格式哦。
另外补充个小要点:9000时间步长其实很长,训练LSTM的时候可能会占用较多内存,如果训练时出现内存不足的问题,可以尝试减小batch_size,或者保持示例中return_sequences=False的设置(默认就是False),避免输出过多序列数据。
内容的提问来源于stack exchange,提问作者espgen
相关产品推荐
相关产品推荐

