Почему бы не использовать Flatten, за которым следует плотный слой вместо TimeDistributed? - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь лучше понять слои Keras.Я работаю над последовательностью к модели последовательности, где я встраиваю предложение и передаю его в LSTM, который возвращает последовательности.В дальнейшем я хочу применить плотный слой к каждому временному шагу (слову) в предложении, и похоже, что TimeDistributed выполняет работу с трехмерными тензорами, как в этом случае.

В моем понимании, плотные слои работают только для двумерных тензоров, а TimeDistributed просто применяет одинаковую плотность на каждом временном шаге в трех измерениях.Можно ли тогда просто сгладить временные шаги, нанести плотный слой и выполнить изменение формы, чтобы получить тот же результат, или они не эквивалентны каким-то образом, которого мне не хватает?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Плотный слой может действовать на любой тензор, не обязательно на ранг 2. И я думаю, что оболочка TimeDistributed ничего не меняет в действии Плотного слоя.Простое применение плотного слоя к тензору ранга 3 будет в точности таким же, как применение оболочки TimeDistributed для плотного слоя.Вот иллюстрация:

from tensorflow.keras.layers import *
from tensorflow.keras.models import *

model = Sequential()

model.add(Dense(5,input_shape=(50,10)))

model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_5 (Dense)              (None, 50, 5)             55        
=================================================================
Total params: 55
Trainable params: 55
Non-trainable params: 0
_________________________________________________________________
model1 = Sequential()

model1.add(TimeDistributed(Dense(5),input_shape=(50,10)))

model1.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
time_distributed_3 (TimeDist (None, 50, 5)             55        
=================================================================
Total params: 55
Trainable params: 55
Non-trainable params: 0
_________________________________________________________________
0 голосов
/ 10 декабря 2018

Представьте, что у вас есть пакет из 4 временных шагов, каждый из которых содержит 3-элементный вектор.Давайте представим это следующим образом:

Input batch

Теперь вы хотите преобразовать этот пакет, используя плотный слой, так что вы получаете 5 объектов за шаг по времени.Выходные данные слоя можно представить примерно так:

Output batch

Вы рассматриваете два варианта: TimeDistributed плотный слой или изменение формы какплоский ввод, нанесение плотного слоя и изменение формы к временным шагам.

В первом варианте вы будете применять плотный слой с 3 входами и 5 выходами для каждого временного шага.Это может выглядеть так:

TimeDistributed layer

Каждый синий круг - это единица в плотном слое.Делая это с каждым шагом ввода времени, вы получите общий результат.Важно отметить, что эти пять единиц одинаковы для всех временных шагов, поэтому у вас есть только параметры одного плотного слоя с 3 входами и 5 выходами.

Второй вариант предполагает сглаживание входа в 12-элемент вектора, применяя плотный слой с 12 входами и 20 выходами, а затем изменяя его обратно.Вот как это будет выглядеть:

Flat dense layer

Здесь для ясности показаны входные соединения только одного блока, но каждый блок будет подключен к каждому входу,Здесь, очевидно, у вас есть гораздо больше параметров (параметров плотного слоя с 12 входами и 20 выходами), а также обратите внимание, что на каждое выходное значение влияет каждое входное значение, поэтому значения в одном временном шаге будут влиять на выходы в других временных шагах.,Является ли это чем-то хорошим или плохим, зависит от вашей проблемы и модели, но это важное различие по сравнению с предыдущим, где каждый шаг ввода-вывода времени был независимым.В дополнение к этому, эта конфигурация требует, чтобы вы использовали фиксированное количество временных шагов в каждой партии, тогда как предыдущий работает независимо от количества временных шагов.

Вы также можете рассмотреть вариант с четырьмя плотными слоями.каждый применялся независимо к каждому временному шагу (я не рисовал его, но, надеюсь, вы поняли).Это было бы аналогично предыдущему, только каждое устройство будет получать входные соединения только от своих соответствующих входов с временным шагом.Я не думаю, что есть простой способ сделать это в Keras, вам придется разделить входные данные на четыре, применить плотные слои к каждой части и объединить выходные данные.Опять же, в этом случае число временных шагов будет фиксированным.

...