时间分布层
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
。
抱歉,我是 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
。