AWD-LSTM из («ОБРАТИЗАЦИЯ И ОПЛАКОВАНИЕ LSTM Language Models») для TensorFlow.
Квантование наград для наград для вывода только по численности арифметика («Квантование и обучение нейронных сетей для эффективного вывода только по численности арифметика») также предоставляется.
Этот код имплемментируется и протестирован с помощью TensorFlow 1.11.0. и 1.13.0.
LayerRNNCell . from weight_drop_lstm import WeightDropLSTMCell
lstm_cell = WeightDropLSTMCell(
num_units=CELL_NUM, weight_drop_kr=WEIGHT_DP_KR,
use_vd=True, input_size=INPUT_SIZE)
Аргументы определяются следующим образом:
num_units: количество ячейки в слое LSTM. [ints]
weight_drop_kr: количество шагов, которые быстрые веса идут вперед. [int]
use_vd: если true, используя вариационное выброс на подключении с каплей, стандартный выброс в противном случае. [Bool]
input_size: еслиuse_vd=True, input_size (измерение последнего канала) должно быть предоставлено. [int]
Оставшиеся аргументы ключевого слова точно такие же, как и tf.nn.LSTMCell .
Отметом, что, если wews_drop_kr не предоставлен и не предоставлен 1,0, WeightDropLSTMCell в качестве LSTMCell .
# By simply sess.run in each training step
sess.run(lstm_cell.get_vd_update_op())
# Or use control_dependencies
vd_update_ops = lstm_cell.get_vd_update_op()
with tf.control_dependencies(vd_update_ops):
tf.train.AdamOptimizer(learning_rate).minimize(loss)
Вы также можете добавить get_vd_update_op() в GraphKeys.UPDATE_OPS при вызове WeightDropLSTMCell .
Отметил, что, если вы используете control_dependencies , пожалуйста, будьте осторожны с заказом выполнения.
Вариационное ядро отсева не должно быть обновленным перед шагом оптимизатора.
Основная идея AWD-LSTM-вес веса подключения и сокрытые входы. 
Если is_vd=True , переменные будут использоваться для сохранения ядра отсева. 
Я провожу эксперименты по поводу рекурсивной задачи для многих ко многим этой реализации и выполняю лучшие результаты, чем простой LSTMCell .
lstm_cell = WeightDropLSTMCell(
num_units=CELL_NUM, weight_drop_kr=WEIGHT_DP_KR,
is_quant=True, is_train=True)
tf.contrib.quantize.create_training_graph(sess.graph, quant_delay=0)
tf.while , в то время как с версией выше 1.12.0 Я также предоставил внедрную реализацию вариационного отсева, которая более гибкая, чем DropoutWrapper в TensorFlow.
Использование аналогично использованию WeightDropLSTMCell :
from variational_dropout import VariationalDropout
vd = VariationalDropout(input_shape=[5], keep_prob=0.5)
# Directly sess.run() to update
sess.run(vd.get_update_mask_op())
# Or use control_dependencies
with tf.control_dependencies(vd.get_update_mask_op()):
step, results_array = tf.while_loop(
cond=lambda step, _: step < 5,
body=main_loop,
loop_vars=(step, results_array))
"""
This is just a simple example.
Usually, control_dependencies will be placed where optimizer stepping.
"""
Вы также можете добавить get_update_mask_op() в GraphKeys.UPDATE_OPS при вызове VariationalDropout .
Еще раз, если вы используете control_dependencies , пожалуйста, будьте осторожны с заказом выполнения.
Если у вас есть предложение, пожалуйста, дайте мне знать. Я буду очень благодарен!
Кодовая работа Jia-yau Shiau [email protected].
Работа кода квантования рекомендуется и раздвоена от Питера Хуанга Питер[email protected]