извините, я новичок в 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
к каждому кадру. В примере из документации у вас есть 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])
Во временных рядах основная идея та же: вы можете применить операцию к функциям каждого временного шага. Поскольку необходимо сохранить зависимость времени, вы должны установить return_sequences=True
перед слоем TimeDistributed
. Например, с вашими данными:
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. Благодаря 3878
это преобразование повторяется на всех временных шагах TimeDistributed
.
Тем не менее, Keras хорошо создан, и применение слоя Dense
к 2D-объекту, например (num_steps x features)
, повлияет только на последнее измерение: features
. Как результат,
Слой Dense
естественно обрабатывается с помощью TimeDistributed
в большинстве временных рядов.
Спасибо! Но когда я вписываюсь, у меня возникает эта ошибка ValueError: Shapes (None, 4) и (None, 3878, 4) несовместимы. 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'))
. Это работает, но, вероятно, это не лучшая архитектура.
Не могли бы вы пояснить, что такое
n_steps
иlength_step
на примере?