【问题标题】:TimeDistributed layer时间分布层
【发布时间】:2021-03-24 13:44:34
【问题描述】:

对不起,我是 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()

【问题讨论】:

  • 您能否举例说明n_stepslength_step 是什么?

标签: python tensorflow keras time-series training-data


【解决方案1】:

因为是分类,我觉得你可能不需要使用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 的创建很好,在像(num_steps x features) 这样的二维对象上应用Dense 层只会影响最后一个维度:features。因此, Dense 层,在大部分时间序列中自然处理TimeDistributed

【讨论】:

  • 谢谢!但是当我适合时,我有这个 ValueError: Shapes (None, 4) and (None, 3878, 4) is incompatible。 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')))modelSimple.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])modelSimple.fit(X_train, y_train, epochs = 7)modelSimple.summary()
  • 是的,这是一个分类问题,所以我提供的代码不是针对您的问题而设计的,而是作为一个示例来解释 TimeDistributed 的工作原理
  • 好的,我知道了,所以我不能使用 Time Distributed 来解决这个问题,对吧?
  • 可以,但必须添加:modelSimple.add(Flatten()) modelSimple.add(Dense(4,activation='softmax'))。它可以工作,但可能不是最好的架构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 2011-11-28
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 2018-12-03
相关资源
最近更新 更多