来自(“正规化和优化LSTM语言模型”)的AWD-LSTM用于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层中的单元格数。 [int]
weight_drop_kr:快速权重的步骤数。 [int]
use_vd:如果为true,则在重量下降连接上使用变分辍学,否则使用标准辍学。 [bool]
input_size:如果use_vd=True,则应提供input_size(上一个通道的维度)。 [int]
其余的关键字参数与tf.nn.LSTMCell完全相同。
指出,如果未提供或提供1.0的weiver_drop_kr,则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)
您还可以在调用WeightDropLSTMCell时将get_vd_update_op()添加到GraphKeys.UPDATE_OPS 。
指出,如果您使用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。 我还提供了变异辍学的张量实现,它比TensorFlow中的DropoutWrapper更灵活。
用法类似于使用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.
"""
您还可以在调用VariationalDropout时将get_update_mask_op()添加到GraphKeys.UPDATE_OPS 。
再一次,如果您使用control_dependencies ,请小心执行顺序。
如果您有任何建议,请告诉我。我会很感激!
jia-yau shiau [email protected]的代码工作。
量化代码工作建议并从彼得黄[email protected]分叉