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次元データセットであり,各次元の意味は[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)