Почему я получаю Nan после добавления активации relu в LSTM?

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

Если я передаю объект подкласса в качестве параметра для метод, который принимает параметр суперкласса типа, я должен, конечно, знать об этом и знать внутренне, вызываемый метод будет работать только с объектом суперкласса (aka baseclass).

Мне кажется, необоснованное ожидание того, что предоставление подкласса, где запрашивается базовый класс, каким-то образом приведет к конкретным результатам подкласса, вызовет проблему разрезания. Его либо плохой дизайн при использовании метода, либо недостаточная реализация подкласса. Я предполагаю, что это обычно результат жертвовать хорошим дизайном ООП в пользу целесообразности или повышения производительности.

1
задан Pawel Faron 24 March 2019 в 10:46
поделиться

1 ответ

Когда вы используете relu activation function внутри lstm cell, гарантируется, что все выходы из ячейки, а также состояние ячейки будут строго >= 0. Из-за этого ваши градиенты становятся чрезвычайно большими и взрываются. Например, запустите следующий фрагмент кода и обратите внимание, что выходные данные никогда не бывают < 0.

X = np.random.rand(4,3,2)
lstm_cell = tf.nn.rnn_cell.LSTMCell(5, activation=tf.nn.relu)
hidden_states, _ = tf.nn.dynamic_rnn(cell=lstm_cell, inputs=X, dtype=tf.float64)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(hidden_states))
0
ответ дан gorjan 24 March 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: