如何将多时序位置数据适配Keras LSTM进行时间序列分类?
适配Keras LSTM层的时间序列二分类方案
嘿,这个问题其实比你想的要省心——你的数据结构刚好完美匹配Keras LSTM的输入要求!我来给你拆解清楚:
首先,你提到Keras LSTM的输入形状是(timestep, dim),这个其实是单个样本的形状,而模型整体期望的输入张量形状是(batch_size, timesteps, features):
batch_size:每次训练喂入的样本数量(训练时会自动处理,不用提前固定)timesteps:每个时间序列的步数,你的数据里是5(每组5个[x,y]位置)features:每个时间步的特征维度,你的是2(x和y两个坐标)
你的X_datas结构[[[xa, ya],[xb, yb],...,[xe, ye]], [...], ...],本质上就是三维结构:外层是所有样本,中间层是每个样本的5个时间步,内层是每个时间步的2维特征。只需要把它转换成numpy数组,就能直接喂给LSTM了。
具体步骤代码示例
- 将列表数据转换为numpy张量
Keras模型需要张量输入(numpy数组或TensorFlow张量),所以先把你的列表转成数组:
import numpy as np # 把X_datas和Y_labels转成numpy数组 X = np.array(X_datas) y = np.array(Y_labels)
转换后X的形状应该是(num_samples, 5, 2),完全符合LSTM的输入要求。
- 定义LSTM二分类模型
在第一个LSTM层里,只需要通过input_shape指定单个样本的形状(5, 2)即可,不用管batch_size:
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense # 初始化序列模型 model = Sequential() # 第一个LSTM层:32个神经元,输入形状(5,2) model.add(LSTM(units=32, input_shape=(5, 2), return_sequences=False)) # 二分类输出层:1个神经元+ sigmoid激活 model.add(Dense(1, activation='sigmoid')) # 编译模型:二分类用binary_crossentropy损失 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
关键参数说明
units=32:LSTM层的神经元数量,你可以根据任务复杂度调整(比如16、64都可以)return_sequences=False:因为我们只需要LSTM最后一个时间步的输出用来做分类,所以设为False;如果后面还要接另一个LSTM层,才需要设为TrueDense(1, activation='sigmoid'):二分类任务的标准输出层,sigmoid会输出0-1之间的概率值,方便判断类别
之后你就可以用model.fit(X, y, epochs=10, batch_size=32)这类代码开始训练了。
内容的提问来源于stack exchange,提问作者Eric Parisot
相关产品推荐
相关产品推荐

