Python 时间分布层

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

对不起,我对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 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'))
。它可以工作,但可能不是最好的架构。好的,谢谢大家!