static_rnnとdynamic_rnnの違い
16778 ワード
static_rnnとdynamic_rnnは、トレーニングデータをRNNネットワークに関連付けることができる.両者の違いはdynamic_rnnは異なる時間ステップのデータをサポートし、static_rnnは、入力されたすべてのデータ時間ステップが同じであることを要求しなければならない.RNNのネットワーク構造は多変的であり,一対多,多対多,多対一であることができる.ネットワーク構造は多様であるがRNNのパラメータには影響しない.RNNのパラメータは同じパラメータセットで適用されるからです.入力されたシーケンスの時間ステップ長は、反復回数によって表されます(入力された次元とは異なり、例えば、10時間連続の3次元データ、時間ステップ長10、入力次元3など).損失関数に適用される出力により出力のデータ次元を表す.実際には反復のたびに1つの出力がありますが、プログラムが損失関数に最後の出力だけを適用した場合、これはマルチペアのネットワークです.BasicLSTMCell関数のnum_を適用しますhiddenがパラメータ次元を決定すると,任意の時間ステップの入力に理論的に対応できるのは,反復回数の変化にほかならない.ただしstaticではサポートされていませんのでdynamic_を適用する必要がありますrnnは入力と出力の関係を確立する.両者の違いは,入出力データの次元においても異なる.我々が通常訓練に用いるデータは3次元データセットであり,各次元の意味は
static_にかかわらずrnnかdynamic_rnn,入出力のデータ次元は同じである.dynamic_とrnnに対応する出力結果outputsのデータ次元は
static_rnnに必要なデータは、次元
第2の方法
完全なプログラムは
[batch_size, time_step, input_size]
である.この次元定義方法はdynamic_とrnnが要求する入力次元は統一されているので,直接入力することができる.プログラム:x = np.array([[[11,12,13,14],[21,22,23,24],[31,32,33,34]],\
[[111,112,113,114],[121,122,123,124],[131,132,133,134]]])
batch_size = 2
time_step = 3
input_size = 4
xs = tf.placeholder(tf.float32,shape=[batch_size, time_step, input_size])
num_hidden = 128
num_class = 2
weights = tf.Variable(tf.random_normal([num_hidden,num_class]))
biases = tf.Variabel(tf.random_normal([num_class]))
lstm_cell =tf.nn.rnn_cell.BasicLSTMCell(num_hidden)
outputs, states =tf.nn.dynamic_rnn(lstm_cell, xs, dtype=tf.float32)
outputs = tf.transpose(outputs, [1, 0, 2])
y = tf.matmul(outputs[-1], weights) + biases)
static_にかかわらずrnnかdynamic_rnn,入出力のデータ次元は同じである.dynamic_とrnnに対応する出力結果outputsのデータ次元は
[batch_size, time_step, output_size]
である.outputs[−1]で得られたデータ次元は[ time_step, output_size]
であり、我々が望むデータ次元は[batch_size, output_size]
であるため、tf.transpose(outputs, [1, 0, 2])
を適用してoutputsの1次元と2次元とを交換する順序が必要である.static_rnnに必要なデータは、次元
[ batch_size, output_size]
の2次元配列からなるlistデータセットである.このデータセットを得るには2つの方法がある.A = tf.transpose(xs, [1, 0, 2]) # permute time_step and batch_size
A = tf.reshape(A, [-1, input_size]) # (time_step*batch_size, input_size)
A = tf.split(A, time_step ,0 ) # time_step * (batch_size, input_size)
第2の方法
A = tf.unstack(xs,num= 3, axis=1)
完全なプログラムは
x = np.array([[[11,12,13,14],[21,22,23,24],[31,32,33,34]],[[111,112,113,114],[121,122,123,124],[131,132,133,134]]])
batch_size = 2
time_step = 3
input_size = 4
xs = tf.placeholder(tf.float32,shape=[batch_size, time_step, input_size])
A = tf.transpose(xs, [1, 0, 2]) # permute time_step and batch_size
A = tf.reshape(A, [-1, input_size]) # (time_step*batch_size, input_size)
A = tf.split(A, time_step ,0 ) # time_step * (batch_size, input_size)
num_hidden = 128
num_class = 2
weights = tf.Variable(tf.random_normal([num_hidden,num_class]))
biases = tf.Variabel(tf.random_normal([num_class]))
lstm_cell =tf.nn.rnn_cell.BasicLSTMCell(num_hidden, forget_bias=1.0)
_init_state=lstm_cell.zero_state(batch_size,dtype=tf.float32)
outputs, states =tf.nn.static_rnn(lstm_cell, A, initial_state=_init_state)
y = tf.matmul(outputs[-1], weights) + biases)