簡體   English   中英

TimeDistributed 層的 CNN-LSTM 時間序列輸入

[英]CNN-LSTM Timeseries input for TimeDistributed layer

我創建了一個 CNN-LSTM 用於 web 會話的生存預測,我的訓練數據如下所示:

print(x_train.shape)
(288, 3, 393) 

帶有(樣本、時間步長、特征)和我的 model:

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 Layer 至少需要 3 個維度,我應該如何轉換數據以使其工作?

非常感謝!

您的數據采用 3d 格式,這就是您提供 conv1d 或 LSTM 所需的全部內容。 如果您的目標是 2D,請記住在最后一個 LSTM 單元中設置 return_sequences=False。

在 LSTM 之前使用 flatten 是一個錯誤,因為您正在破壞 3D 維度

還要注意池化操作,以免減少負時間維度(我在上面的卷積中使用“相同”填充以避免這種情況)

下面是一個二元分類任務的例子

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM