Слой 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()

Не могли бы вы пояснить, что такое n_steps и length_step на примере?

Akshay Sehgal 13.12.2020 21:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
1 618
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку это классификация, я не думаю, что вам может понадобиться использовать слой 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()

Somnus 14.12.2020 18:42

Да, это проблема классификации, поэтому код, который я предоставил, предназначен не для вашей проблемы, а в качестве примера, объясняющего, как работает TimeDistributed.

B Douchet 14.12.2020 18:47

Хорошо, я понял, поэтому я не могу использовать Time Distributed с этой проблемой, верно?

Somnus 14.12.2020 18:48

вы можете, но вы должны добавить: modelSimple.add(Flatten()) modelSimple.add(Dense(4,activation='softmax')). Это работает, но, вероятно, это не лучшая архитектура.

B Douchet 14.12.2020 18:53

Другие вопросы по теме