我正在尝试使用LSTM来建模多样本时间序列数据。我的输入数据具有形状(100,93,6) - 100个独立的时间序列(来自相同/相似的过程),93个时间步长,每个观察6个维度。输出形状为(100,93) - 每个独立时间序列的每个时间步长一个bool输出。 (当然,这是一小部分真实数据)。但是,我无法弄清楚如何在Keras中构建这样一个网络:
from keras.models import Sequential
from keras.layers import LSTM, core, Activation, Dense
import numpy as np
data = np.load('sample.npz')
X = data['x']
y = data['y']
print('X shape: ',X.shape)
print('{} samples, {} time steps, {} observations at each time step, per sample\n'.format(*X.shape))
print('y shape: ',y.shape)
print('{} samples, {} time steps, boolean outcome per observation\n'.format(*y.shape))
print(X[0][2], X[0][55])
print(y[0][2], y[0][92])
X形:(100,93,6)100个样品,93个时间步,6个观察点 每个时间步,每个样本
y形状:(100,93)100个样本,93个时间步长,每个布尔结果 观察
[1.80000000e + 01 1.56000000e + 05 2.00000000e + 03 1.00000000e + 04 3.00000000e + 00 5.94000000e + 04] [0. 0. 0. 0. 0. 0。]
1.0 0.0
model = Sequential()
model.add(LSTM(output_dim=4, input_shape=(93, 6), return_sequences=False))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam')
model.fit(X, y, verbose=2)
异常:检查模型目标时出错:期望的密集_2 形状(无,1),但有阵列形状(100,93)
我相信Keras假设每个时间序列有一个输出(Y),而每个时间序列每个时间步有一个输出。如何让它在Keras中运作?
答案 0 :(得分:2)
我错过了TimeDistributed
图层..
这有效:
model = Sequential()
model.add(LSTM(output_dim=4, input_shape=(93, 6), return_sequences=True))
model.add(TimeDistributed(Dense(1, activation='sigmoid')))
model.compile(loss='binary_crossentropy', optimizer='adam')