Какую ось Keras SimpleRNN / LSTM использует в качестве временной оси по умолчанию? - PullRequest
3 голосов
/ 07 марта 2020

При использовании SimpleRNN или LSTM для классического алгоритма анализа настроений алгоритмов (применяется здесь к предложениям длиной <= 250 слов / токенов): </p>

model = Sequential()
model.add(Embedding(5000, 32, input_length=250))   # Output shape: (None, 250, 32)
model.add(SimpleRNN(100))                          # Output shape: (None, 100)
model.add(Dense(1, activation='sigmoid'))          # Output shape: (None, 1) 

где указано, какая ось ввода RNN используется в качестве «временной» оси?

Чтобы быть более точным, после слоя Embedding заданное входное предложение, например «кот сидел на коврике» , кодируется в матрицу x формы (250, 32), где 250 - максимальная длина (в словах) входного текста, а 32 - размерность вложение. Затем, где в Керасе указано, будет ли это использоваться:

  1. h[t] = activation( W_h * x[:, t] + U_h * h[t-1] + b_h )

или это:

h[t] = activation( W_h * x[t, :] + U_h * h[t-1] + b_h )

(В обоих случаях y[t] = activation( W_y * h[t] + b_y ))

TL; DR: если вход для слоя RNN Keras имеет размер, скажем, (250, 32), какую ось он использует в качестве временной оси по умолчанию? Где это подробно описано в документации Keras или Tensorflow?


PS: как объяснить количество параметров (заданных model.summary()), которое составляет 13300? W_h имеет 100x32 кофа, U_h имеет 100x100 кофа, b_h имеет 100x1 кофа, то есть у нас уже есть 13300! Не осталось ни одного кофта для W_y и b_y! Как это объяснить?

1 Ответ

3 голосов
/ 11 марта 2020

Временная ось : всегда тусклый 1, если только time_major=True, то тусклый 2; слой Embedding выводит 3D-тензор. Это можно увидеть здесь , где step_input_shape - это форма ввода, подаваемого в RNN cell на каждом шаге в рекуррентном l oop. Для вашего случая timesteps=250, и ячейка SimpleRNN «видит» тензор в форме (batch_size, 32) на каждом шаге.


# параметров : вы можете увидеть, как фигура получается путем проверки кода .build() каждого слоя: Embedding , SimpleRNN , Dense или аналогичным образом вызывая .weights на каждом уровне. Для вашего случая, w / l = model.layers[1]:

  • l.weights[0].shape == (32, 100) -> 3200 параметров (kernel)
  • l.weights[1].shape == (100, 100) -> 10000 параметров (recurrent_kernel) )
  • l.weights[2].shape == (100,) -> 100 параметров (bias) ( сумма: 13 300 )

Журнал вычислений c: нет W_y или b_y; «y» - скрытое состояние, h, фактически для всех повторяющихся слоев - то, что вы цитируете, вероятно, из обобщенных c формул RNN. @ "в обоих случаях ..." - это неверно; чтобы увидеть, что на самом деле происходит, проверьте код .call().

PS Я рекомендую определить полную batch_shape модели для отладки, поскольку она устраняет неоднозначные None формы


Формула SimpleRNN против кода : по запросу; обратите внимание, что h в исходном коде вводит в заблуждение и обычно z в формулах («предварительная активация»).

enter image description here

  • return_sequences=True -> возвращаются выходы для всех временных шагов: (batch_size, timesteps, channels)

  • return_sequences=False -> только последний Возвращается вывод временного шага: (batch_size, 1, channels). См. здесь

...