Внедрение LSTM в Керасе - PullRequest
       16

Внедрение LSTM в Керасе

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

Я использую Keras, используя Tensorflow backend.

model = Sequential()
model.add(Masking(mask_value = 0., input_shape = (MAX_LENGTH, 1)))
model.add(LSTM(16, input_shape = (BATCH_SIZE, MAX_LENGTH, 1), return_sequences = False))
model.add(Dense(units = 2))
model.add(Activation("sigmoid"))
model.compile(loss = "binary_crossentropy", optimizer = "adam", metrics = ["accuracy"])

Этот код Python работает, но мне интересно, есть ли 16 блоков LSTM с 1 ячейкой каждый или 1 блок LSTM с 16 ячейками.

Заранее спасибо!

LSTM architecture

Ответы [ 3 ]

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

Когда вы используете ячейки LSTM, GRU, у вас нет понятия слоев как таковых.На самом деле у вас есть клетка, в которой реализовано несколько ворот.Каждый из ворот состоит из отдельной весовой матрицы, которую модель выучит во время тренировки.Например, в вашем случае у вас будет 1 ячейка, где каждый из ворот, определенных матрицами, будет иметь размерность (feature_size_of_your_input, 16).Я советую вам прочитать: http://colah.github.io/posts/2015-08-Understanding-LSTMs/ очень внимательно, прежде чем вы начнете реализовывать подобные вещи.В противном случае вы просто используете их как модель черного ящика, не понимая, что происходит под капотом.

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

Хорошо, так что ваш вопрос заставил меня задуматься, и я думаю, что я сделал это, но здесь ничего не происходит.Вот фрагмент кода, который я сделал, чтобы получить представление о реализации LSTM.

from keras.layers import LSTM
from keras.models import Sequential

model = Sequential()
model.add(LSTM(10, input_shape=(20, 30), return_sequences=True))
model.compile(loss='mse',optimizer='adam', metrics=['accuracy'])
weights = model.get_weights()

Теперь, изучая формы весов, мы можем получить представление о том, что происходит.

In [12]: weights[0].shape
Out[12]: (30, 40)
In [14]: weights[1].shape
Out[14]: (10, 40)
In [15]: weights[2].shape
Out[15]: (40,)

И вот их описание:

In [26]: model.weights
Out[26]: 
[<tf.Variable 'lstm_4/kernel:0' shape=(30, 40) dtype=float32_ref>,
 <tf.Variable 'lstm_4/recurrent_kernel:0' shape=(10, 40) dtype=float32_ref>,
 <tf.Variable 'lstm_4/bias:0' shape=(40,) dtype=float32_ref>]

Это единственные доступные веса.Я также посмотрел реализацию Keras на https://github.com/keras-team/keras/blob/master/keras/layers/recurrent.py#L1765

Итак, вы можете видеть, что @gorjan был прав, он реализует одну ячейку, то есть 4 шлюза (для рекуррентного ввода, а также для ввода последовательности),вместе с их предвзятостью.

Мышление «слоя» здесь должно применяться к числу раз, когда LSTM будет развернут, в данном случае 30.

Надеюсь, это поможет.

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

Это за 1 блок, 16 ячеек, афаик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...