Когда вы используете 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))
Уровень 2 оптимизации.
Из страницы справочника GCC:
- O1 Оптимизируют. Оптимизация компиляции занимает несколько больше времени и намного больше памяти для большой функции.
- O2 Оптимизируют еще больше. GCC выполняет почти всю поддерживаемую оптимизацию, которая не включает компромисс скорости пространства. Компилятор не выполняет развертывание цикла или встраивание функции при определении-O2. По сравнению с-O эта опция увеличивает и время компиляции и производительность сгенерированного кода.
- O3 Оптимизируют еще больше.-O3 включает всю оптимизацию, указанную-O2, и также включает - finline-функции, - funswitch-циклы,-fpredictive-commoning, - fgcse после того, как перезагрузки и - ftree-векторизуют опции.
- O0 Уменьшают время компиляции и заставляют отладку привести к ожидаемым результатам. Это - значение по умолчанию.
- OS Оптимизирует для размера. - OS включает всю-O2 оптимизацию, которая обычно не увеличивает размер кода. Это также выполняет дальнейшую оптимизацию, разработанную для сокращения размера кода.
Это - оптимизировать переключатель. См. gcc - справка.
Испытанная страница справочника?
- O2
Оптимизируйте еще больше. GCC выполняет почти всю поддерживаемую оптимизацию, которая не включает компромисс скорости пространства. Компилятор не выполняет развертывание цикла или встраивание функции при определении-O2. По сравнению с-O эта опция увеличивает и время компиляции и производительность сгенерированного кода.
В человеческих словах: это - самый высокий действительно безопасный способ оптимизации.-O3 делает перестройки, которые могут время от времени быть неприятными. Предмет как таковой довольно глубок.
Уровень 2 оптимизации, макс. 3. См.: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Отметьте, это в несколько лет назад -O3
мог вызвать некоторые незначительные сбои путем чрезмерной "оптимизации" кода. AFAIK, это больше не верно с современными версиями GCC. Но с инерцией, -O2
считается "макс. сейфом".
Компиляторы могут использовать различные методы оптимизации как развертывание цикла, конвейерная оптимизация ЦП, чтобы найти бесполезный код и избежать опасностей данных для ускорения кода. Например, цикл, который происходит установленная сумма времен, будет преобразован в непрерывный код без управления циклом наверху. Или если все повторения цикла независимы, некоторое распараллеливание кода возможно.
Установка уровня оптимизации к 2 говорит, сколько энергии компилятор должен потратить поиск той оптимизации. Возможные значения колеблются от 1 до 3
Можно узнать больше о том, что компилятор может сделать для оптимизации кода: http://en.wikipedia.org/wiki/Compiler_optimization