Я изо всех сил пытаюсь интерпретировать разницу кодирования Keras для маркировки последовательностей «один ко многим» (например, классификация отдельных изображений) и «многие ко многим» (например, классификация последовательностей изображений). Я часто вижу два разных вида кодов:
Тип 1, где TimeDistributed не применяется, как это:
model=Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode="valid", input_shape=[1, 56,14]))
model.add(Activation("relu"))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Reshape((56*14,)))
model.add(Dropout(0.25))
model.add(LSTM(5))
model.add(Dense(50))
model.add(Dense(nb_classes))
model.add(Activation("softmax"))
Тип 2, где TimeDistributed применяется следующим образом:
model = Sequential()
model.add(InputLayer(input_shape=(5, 224, 224, 3)))
model.add(TimeDistributed(Convolution2D(64, (3, 3))))
model.add(TimeDistributed(MaxPooling2D((2,2), strides=(2,2))))
model.add(LSTM(10))
model.add(Dense(3))
Мои вопросы:
Верно ли мое предположение о том, что Тип 1 относится ко многим, а Тип 2 ко многим? Или не
TimeDistributed
имеет никакого отношения в этом аспекте?В любом случае один-ко-многим или многие-ко-многим является последним плотный слой должен быть один узел «длинный» (излучающие только одно значение , в свою очередь) и
предыдущий рецидивирующий слой отвечает , чтобы определить , сколько
1-долго значение излучать? Или последний плотный слой должен состоять из N узлов , гдеN=max sequence length
? Если да, то смысл
использования РНН здесь , когда мы могли бы производить подобный вход с несколькими
выходами с N параллельных «ванильных» оценками?Как определить число временных шагов в RNNs? Является ли это каким - то образом
коррелирует с длиной выходной последовательности или это просто
гиперпараметр настроиться?Inn случае моего примера 1 типа выше чем смысл применения
LSTM , когда модель выделяет только один класс предсказания (возможные
nb_classes
)? Что если пропустить слой LSTM?
Ответы:
Смысл использования любого рекуррентного слоя состоит в том, чтобы результат был результатом не только одного элемента, независимого от других элементов, но и последовательности элементов, так что результат работы слоя над одним элементом в последовательности является результатом как этого элемента, так и любого элемента перед ним в последовательности. Количество временных шагов определяет, какова длина такой последовательности. То есть, сколько элементов должны обрабатываться в последовательности и влиять на итоговый вывод друг друга.
Уровень LSTM работает таким образом, что он принимает входные данные в форме number_of_timesteps, dimension_of_each_item. Если return_sequences параметра установлен в FALSE, которой он по умолчанию слоя «соединение» входы всех временных шагов в один выходной. Если вы рассмотрите последовательность, скажем, 10 элементов, слой LSTM с возвращаемым значением False, установленным в False, из такой последовательности произведет один выходной элемент, а атрибуты этого одного элемента будут результатом всех элементов (временных шагов) в последовательность. Это то, что вы хотите в случае дизайна «многие к одному».
Слой LSTM с параметром return_sequence, установленным в True, будет выводить каждый элемент (временной шаг) во входной последовательности. Это делается таким образом, что на любом временном шаге вывод будет зависеть не только от элемента, с которым в данный момент выполняется операция, но и от предыдущих элементов в последовательности. Это то, что вы хотите в случае дизайна «многие ко многим».
Поскольку слой LSTM принимает последовательность элементов в качестве входных данных, любой слой до уровня LSTM в вашей модели должен будет генерировать последовательность в качестве выходных данных. В случае вашей модели типа 1 первые несколько слоев работают не с последовательностями, а с одним элементом за раз. Следовательно, это не создает последовательность элементов, для которых необходимо работать для LSTM.
Использование TimeDistributed позволяет иметь слой, работающий с каждым элементом в последовательности, без влияния элементов друг на друга. Таким образом, слои TimeDistributed работают с последовательностями элементов, но рекурсия отсутствует.
В случае вашей модели типа 2 первые слои будут создавать последовательность длиной 5 шагов, и операции, выполняемые с каждым из элементов в последовательности, будут независимы друг от друга, так как слои, заключенные в TimeDistributed, являются неповторяющимися. Поскольку уровень LSTM использует настройки по умолчанию return_sequence = False, уровень LSTM будет генерировать один выход для каждой такой последовательности из 5 элементов.
Окончательное количество выходных узлов в вашей модели полностью зависит от варианта использования. Один узел подходит для чего-то вроде бинарной классификации или для получения некоторой оценки.
источник
Я думаю, что вы могли бы использовать мою предыдущую работу. В этом коде я создаю синусоидальные волны (случайных длин волн и фаз) и обучаю LSTM последовательности точек из этих синусоидальных волн и выводю последовательность из 150 точек, завершающих каждую синусоидальную волну.
Это модель:
И это весь сценарий:
источник