时间分布层

TimeDistributed layer

抱歉,我是 keras 和 RNN 的新手。我有这些数据可以用来训练。 X_train=(n_steps=25, length_steps=3878, n_features=8) 的形状,y_train=(n_steps=25, n_features=4) 的形状。基本上对于长度为 3878 和 8 个特征的每个步骤,我有一个目标是四个。现在,我不知道如何用“时间结构”训练这些数据。有人告诉我使用 TimeDistributed 层,但我对形状有疑问。我怎样才能在这上面使用 TimeDistributed?

import numpy as np
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, TimeDistributed, SimpleRNN

modelSimple = Sequential()

modelSimple.add(SimpleRNN(200, return_sequences=True, activation='softmax'))
modelSimple.add(SimpleRNN(200, return_sequences=False, activation='softmax'))
modelSimple.add(Dense(4, activation='softmax'))
modelSimple.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
modelSimple.fit(X_train, y_train, epochs = 7)
modelSimple.summary()

因为是分类,我认为你可能不需要使用TimeDistributed层。

但是我可以向您解释,TimeDistributed 允许您对每个时间步应用相同的操作。例如,在视频中,您可能希望对每一帧应用相同的 Conv2D。在 documentation 的示例中,您有 10 帧,并且对每一帧应用相同的卷积:

>>> inputs = tf.keras.Input(shape=(10, 128, 128, 3))
>>> conv_2d_layer = tf.keras.layers.Conv2D(64, (3, 3))
>>> outputs = tf.keras.layers.TimeDistributed(conv_2d_layer)(inputs)
>>> outputs.shape

TensorShape([None, 10, 126, 126, 64])

在时间序列中,核心思想是相同的:您可能希望对每个时间步长的特征应用操作。因为要保持时间依赖性,所以应该在TimeDistributed层之前设置return_sequences=True。例如你的数据:

modelSimple.add(SimpleRNN(200, return_sequences=True, activation='softmax',input_shape=(3878,8)))
modelSimple.add(SimpleRNN(200, return_sequences=True, activation='softmax'))
modelSimple.add(TimeDistributed(Dense(4, activation='softmax')))

给你:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
simple_rnn_15 (SimpleRNN)    (None, 3878, 200)         41800     
_________________________________________________________________
simple_rnn_16 (SimpleRNN)    (None, 3878, 200)         80200     
_________________________________________________________________
time_distributed_9 (TimeDist (None, 3878, 4)           804       
=================================================================

所以你有一个 Dense 层,它将 200 个特征转换为 4 个特征。由于 TimeDistributed.

,这种转换在所有 3878 时间步长上重复进行

然而,Keras 创建得很好,在二维对象上应用 Dense 层,如 (num_steps x features) 只会影响最后一个维度:features。因此, Dense 层,在大多数时间序列中自然处理 TimeDistributed