AWD-LSTM de ("régulariser et optimiser les modèles de langage LSTM") pour TensorFlow.
La quantification de la formation pour la formation pour une inférence entière-arithmétique uniquement ("La quantification et la formation des réseaux de neurones pour une inférence efficace entière-arithmétique uniquement") est également fournie.
Ce code est implémenté et testé avec TensorFlow 1.11.0. et 1.13.0.
LayerRNNCell standard. 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)
Les arguments sont définis comme suit:
num_units: le nombre de cellules dans la couche LSTM. [INTS]
weight_drop_kr: le nombre d'étapes selon lesquelles les poids rapides vont de l'avant. [int]
use_vd: si vrai, en utilisant un dépôt variationnel sur le licenciement de poids, décrochez standard autrement. [bool]
input_size: siuse_vd=True, input_size (dimension du dernier canal) doit être fourni. [int]
Les arguments de mots clés restants sont exactement les mêmes que tf.nn.LSTMCell .
A noté que si le poids_drop_kr n'est pas fourni ou fourni avec 1,0, WeightDropLSTMCell est réduit comme 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)
Vous pouvez également ajouter get_vd_update_op() à GraphKeys.UPDATE_OPS lors de l'appel WeightDropLSTMCell .
A noté que si vous utilisez control_dependencies , faites attention à l'ordre d'exécution.
Le noyau de dépôt variationnel ne doit pas être mis à jour avant l'étape d'optimiseur.
L'idée principale de la traction AWD-LSTM est les poids de libonette et les entrées concratinées. 
Si is_vd=True , les variables seront utilisées pour enregistrer le noyau d'abandon. 
J'ai mené des expériences sur une tâche récursive de plusieurs à plusieurs cette implémentation et réalise de meilleurs résultats que le simple 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 avec une version supérieure à 1,12.0 J'ai également fourni une implémentation TensorFlow de Dropout Variational, qui est plus flexible que DropoutWrapper dans TensorFlow.
L'utilisation est similaire à l'utilisation 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.
"""
Vous pouvez également ajouter get_update_mask_op() à GraphKeys.UPDATE_OPS lors de l'appel VariationalDropout .
Encore une fois, si vous utilisez control_dependencies , faites attention à l'ordre d'exécution.
Si vous avez une suggestion, faites-le moi savoir. Je serai assez reconnaissant!
Travail de code par Jia-Yau shiau [email protected].
Le travail du code de quantification est conseillé et fourchu de Peter Huang [email protected]