私は最近、LayerNormBasicLSTMCellがLayer Normalizationとドロップアウトが実装されたLSTMのバージョンであることを発見しました。したがって、元のコードをLSTMCellをLayerNormBasicLSTMCellに置き換えました。この変更により、96%から〜92%までのテスト精度が低下しただけでなく、訓練に長時間(約33時間)かかる(元の訓練時間は約6時間)。エポックの数(10)、スタックされたレイヤの数(3)、隠れたベクトルサイズ(250)の数、ドロップアウトの保持の問題(0.5)、...すべてのパラメータは同じです。なぜLayerNormBasicLSTMCellはLSTMCellよりもはるかに遅く正確さが劣るのですか?
私の質問は次のとおりです。私はここで間違っていましたか? (LSTMCellを使用して)
私のオリジナルモデル:
# Batch normalization of the raw input
tf_b_VCCs_AMs_BN1 = tf.layers.batch_normalization(
tf_b_VCCs_AMs, # the input vector, size [#batches, #time_steps, 2]
axis=-1, # axis that should be normalized
training=Flg_training, # Flg_training = True during training, and False during test
trainable=True,
name="Inputs_BN"
)
# Bidirectional dynamic stacked LSTM
##### The part I changed in the new model (start) #####
dropcells = []
for iiLyr in range(3):
cell_iiLyr = tf.nn.rnn_cell.LSTMCell(num_units=250, state_is_tuple=True)
dropcells.append(tf.nn.rnn_cell.DropoutWrapper(cell=cell_iiLyr, output_keep_prob=0.5))
##### The part I changed in the new model (end) #####
MultiLyr_cell = tf.nn.rnn_cell.MultiRNNCell(cells=dropcells, state_is_tuple=True)
outputs, states = tf.nn.bidirectional_dynamic_rnn(
cell_fw=MultiLyr_cell,
cell_bw=MultiLyr_cell,
dtype=tf.float32,
sequence_length=tf_b_lens, # the actual lengths of the input sequences (tf_b_VCCs_AMs_BN1)
inputs=tf_b_VCCs_AMs_BN1,
scope = "BiLSTM"
)
(LayerNormBasicLSTMCellを使用して)私の新しいモデル:
...
dropcells = []
for iiLyr in range(3):
cell_iiLyr = tf.contrib.rnn.LayerNormBasicLSTMCell(
num_units=250,
forget_bias=1.0,
activation=tf.tanh,
layer_norm=True,
norm_gain=1.0,
norm_shift=0.0,
dropout_keep_prob=0.5
)
dropcells.append(cell_iiLyr)
...
考え:[https://stackoverflow.com/questions/43234667/tf-layers-batch-normalization-large-test-error](this)が問題になりますか? 平均と分散が 'tf.layers.batch_normalization'で自動的に更新されないようです。 'tf.contrib.rnn.LayerNormBasicLSTMCell'に同じ問題があるのだろうかと思います。 –
@FariborzGhavamian、正規化関数(つまり、 'update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)'と 'tf.control_dependencies(update_ops):' ...)の両方に2番目の方法を使用しました。 –
トレーニング時間について:私はtensorflowのウェブサイトでこれを見つけました:https://www.tensorflow.org/performance/performance_guide#common_fused_ops。 'fused'というパラメータを有効にして、12%-30%の速度を上げることができます。 –