Python 时间分布层
对不起,我对keras和RNN一般来说都是新手。我有这些数据来进行培训。Python 时间分布层,python,tensorflow,keras,time-series,training-data,Python,Tensorflow,Keras,Time Series,Training Data,对不起,我对keras和RNN一般来说都是新手。我有这些数据来进行培训。X\u列的形状=(n\u步数=25,长度\u步数=3878,n\u特征=8),y\u列的形状=(n\u步数=25,n\u特征=4)。基本上,对于长度为3878和8个特征的每一步,我的目标是4个。现在,我不知道如何用“时间结构”来训练这些数据。有人告诉我使用时间分布层,但我的形状有问题。我如何在这上面使用时间分配 import numpy as np from tensorflow import keras from tens
X\u列的形状=(n\u步数=25,长度\u步数=3878,n\u特征=8)
,y\u列的形状=(n\u步数=25,n\u特征=4)
。基本上,对于长度为3878和8个特征的每一步,我的目标是4个。现在,我不知道如何用“时间结构”来训练这些数据。有人告诉我使用时间分布层,但我的形状有问题。我如何在这上面使用时间分配
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
。在中的示例中,您有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\u 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
=================================================================
因此,您有一个密集的
层,它将200个要素转换为4个要素。由于TimeDistributed
,此转换在所有3878
时间步长上重复
但是,Keras创建得很好,并且在2D对象上应用密集的层,如(num\u steps x features)
只会影响最后一个维度:features
。因此,
密集
层,在大多数时间序列中,自然地使用时间分布
进行处理。
因为它是分类,我认为您可能不需要使用时间分布
层。
不过,我可以向您解释,TimeDistributed
允许您在每个时间步上应用相同的操作。例如,在视频中,您可能希望在每个帧上应用相同的Conv2D
。在中的示例中,您有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\u 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
=================================================================
因此,您有一个密集的
层,它将200个要素转换为4个要素。由于TimeDistributed
,此转换在所有3878
时间步长上重复
但是,Keras创建得很好,并且在2D对象上应用密集的层,如(num\u steps x features)
只会影响最后一个维度:features
。因此,
密集
层,在大多数时间序列中,自然地以时间分布
进行处理。
你能举例说明n\u步
和length\u步
是什么吗?你能举例说明n\u步
和length\u步
是什么吗?谢谢!但当我适合时,我有一个错误:形状(None,4)和(None,3878,4)是不兼容的modelSimple.add(SimpleRNN(200,return\u sequences=True,activation='softmax',input\u shape=(3878,8))
modelSimple.add(SimpleRNN(200,return\u sequences=True,activation='softmax'))
modelSimple.compile(loss='classifical\u crossentropy',optimizer='adam',metrics=['accurity'])
modelSimple.fit(X\u列,y\u列,epochs=7)
modelSimple.summary()
是的,这是一个分类问题,因此我提供的代码不是针对您的问题设计的,而是作为一个示例来解释TimeDistributed
worksOk我得到了它,因此我不能将时间分布用于此问题,对吗?您可以,但您必须添加:modelSimple.add(flatte())modelSimple.add(稠密(4,activation='softmax'))
。它可以工作,但可能不是最好的架构。好的,谢谢大家!谢谢!但当我合适的时候,我有一个错误:形状(无,4)和(无,3878,4)不兼容。modelSimple.add(SimpleRNN(200,return\u sequences=True,activation='softmax',input\u shape=(3878,8))
modelSimple.add(SimpleRNN(200,return\u sequences=True,activation='softmax'))
modelSimple.add(时间分布(密集(4,activation='softmax')))
modelSimple.compile(loss='classifical\u crossentropy',optimizer='adam',metrics=['accurrency'])
modelSimple.fit(X\u列,y\u列,epochs=7)
modelSimple.summary()
是的,这是一个分类问题,因此我提供的代码不是针对您的问题设计的,而是作为一个示例来解释TimeDistributed
worksOk我得到了它,因此我不能将时间分布用于此问题,对吗?您可以,但您必须添加:modelSimple.add(flatte())modelSimple.add(稠密(4,activation='softmax'))
。它可以工作,但可能不是最好的架构。好的,谢谢大家!