AWD-LSTM von ("Regularisierung und Optimierung von LSTM-Sprachmodellen") für TensorFlow.
Die Quantisierung von Training-Ated-Quantisierung für Inferenz für ganzzahl-arithmetische ("Quantisierung und Ausbildung neuronaler Netzwerke für effiziente Inferenz für ganzzahl-arithmetische Nur-Rang") wird ebenfalls bereitgestellt.
Dieser Code wird mit TensorFlow 1.11.0 getestet und getestet. und 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)
Argumente sind wie folgt definiert:
num_units: Die Anzahl der Zellen in der LSTM -Schicht. [INTs]
weight_drop_kr: Die Anzahl der Schritte, die so schnell Gewichte vorwärts gehen. [int]
use_vd: Wenn wahr, mithilfe von Variationstropfen auf Gewichtsabfall-Connect-Standard-Tropfen ansonsten. [bool]
input_size: Wennuse_vd=True, input_size (Dimension des letzten Kanals) bereitgestellt werden sollte. [int]
Die verbleibenden Keyword -Argumente sind genau das gleiche wie tf.nn.LSTMCell .
Bezeichneten, dass, wenn das Gewicht_Drop_KR nicht bereitgestellt oder mit 1.0 versorgt wird, WeightDropLSTMCell als LSTMCell reduziert wird.
# 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)
Sie können auch WeightDropLSTMCell get_vd_update_op() zu GraphKeys.UPDATE_OPS hinzufügen.
Beachten Sie, dass, wenn Sie control_dependencies verwenden, bitte vorsichtig auf die Ausführungsreihenfolge seien.
Der Variationstropfen -Kernel sollte nicht vor dem Optimierer -Schritt aktualisiert werden.
Die Hauptidee von AWD-LSTM sind die Drop-Connect-Gewichte und kontinierten Eingänge. 
Wenn is_vd=True , werden Variablen verwendet, um den Dropout -Kernel zu speichern. 
Ich habe Experimente zu einer vielen zu viele rekursive Aufgabe in dieser Implementierung durchführend und eine bessere Ergebnisse durchführen als einfache 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 , wobei die Version höher als 1.12.0 ist Ich habe auch eine Tensorflow -Implementierung des Variationsabbrechers zur Verfügung gestellt, die im Tensorflow flexibler als DropoutWrapper ist.
Die Verwendung ähnelt der Verwendung 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.
"""
Sie können auch get_update_mask_op() zu GraphKeys.UPDATE_OPS hinzufügen, wenn Sie VariationalDropout aufrufen.
Noch einmal, wenn Sie control_dependencies verwenden, achten Sie bitte vorsichtig mit der Ausführung.
Wenn Sie Vorschläge haben, lassen Sie es mich bitte wissen. Ich werde ziemlich dankbar sein!
Codearbeit von jia-yau shiau [email protected].
Quantisierungscode -Arbeit wird von Peter Huang [email protected] beraten und gegossen