TimeDistributed 层的 CNN-LSTM 时间序列输入
CNN-LSTM Timeseries input for TimeDistributed layer
我创建了一个 CNN-LSTM 用于网络会话的生存预测,我的训练数据如下所示:
print(x_train.shape)
(288, 3, 393)
具有(样本、时间步长、特征)和我的模型:
model = Sequential()
model.add(TimeDistributed(Conv1D(128, 5, activation='relu'),
input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(TimeDistributed(MaxPooling1D()))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(64, stateful=True, return_sequences=True))
model.add(LSTM(16, stateful=True))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer=Adam(lr=0.001), loss='binary_crossentropy', metrics=['accuracy'])
但是,TimeDistributed
层至少需要 3 个维度,我应该如何转换数据才能使其正常工作?
非常感谢!
您的数据是 3d 格式的,这就是您需要提供给 conv1d 或 LSTM 的全部内容。如果您的目标是 2D,请记得在最后一个 LSTM 单元格中设置 return_sequences=False。
在 LSTM 之前使用展平是错误的,因为您正在破坏 3D 维度
还要注意池化操作,以免减少负时间维度(我在上面的卷积中使用 'same' 填充以避免这种情况)
下面是二元分类任务中的一个例子
n_sample, time_step, n_features = 288, 3, 393
X = np.random.uniform(0,1, (n_sample, time_step, n_features))
y = np.random.randint(0,2, n_sample)
model = Sequential()
model.add(Conv1D(128, 5, padding='same', activation='relu',
input_shape=(time_step, n_features)))
model.add(MaxPooling1D())
model.add(LSTM(64, return_sequences=True))
model.add(LSTM(16, return_sequences=False))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X,y, epochs=3)
我创建了一个 CNN-LSTM 用于网络会话的生存预测,我的训练数据如下所示:
print(x_train.shape)
(288, 3, 393)
具有(样本、时间步长、特征)和我的模型:
model = Sequential()
model.add(TimeDistributed(Conv1D(128, 5, activation='relu'),
input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(TimeDistributed(MaxPooling1D()))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(64, stateful=True, return_sequences=True))
model.add(LSTM(16, stateful=True))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer=Adam(lr=0.001), loss='binary_crossentropy', metrics=['accuracy'])
但是,TimeDistributed
层至少需要 3 个维度,我应该如何转换数据才能使其正常工作?
非常感谢!
您的数据是 3d 格式的,这就是您需要提供给 conv1d 或 LSTM 的全部内容。如果您的目标是 2D,请记得在最后一个 LSTM 单元格中设置 return_sequences=False。
在 LSTM 之前使用展平是错误的,因为您正在破坏 3D 维度
还要注意池化操作,以免减少负时间维度(我在上面的卷积中使用 'same' 填充以避免这种情况)
下面是二元分类任务中的一个例子
n_sample, time_step, n_features = 288, 3, 393
X = np.random.uniform(0,1, (n_sample, time_step, n_features))
y = np.random.randint(0,2, n_sample)
model = Sequential()
model.add(Conv1D(128, 5, padding='same', activation='relu',
input_shape=(time_step, n_features)))
model.add(MaxPooling1D())
model.add(LSTM(64, return_sequences=True))
model.add(LSTM(16, return_sequences=False))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X,y, epochs=3)