2017-07-13 15 views
0

私は単層LSTMを構築しました。できます。Tensorflow:Multilayered dynamic_rnnを実装する方法は?

重みとバイアスとRNN構造体の定義に次のコードフォーカス:

# Define weights 
weights = { 
    'in': tf.Variable(tf.random_normal([n_inputs, n_hidden_units])), 
    'out': tf.Variable(tf.random_normal([n_hidden_units, n_classes])) 
} 
biases = { 
    'in': tf.Variable(tf.constant(0.1, shape=[n_hidden_units, ])), 
    'out': tf.Variable(tf.constant(0.1, shape=[n_classes, ])) 
} 


def RNN(X, weights, biases): 

    X = tf.reshape(X, [-1, n_inputs]) 

    X_in = tf.matmul(X, weights['in']) + biases['in'] 
    X_in = tf.reshape(X_in, [-1, n_steps, n_hidden_units]) 

    lstm_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden_units) 

    init_state = lstm_cell.zero_state(batch_size_holder, dtype=tf.float32) 

    outputs, final_state = tf.nn.dynamic_rnn(lstm_cell, X_in, initial_state=init_state, time_major=False) 

    outputs = tf.unstack(tf.transpose(outputs, [1,0,2])) 
    results = tf.matmul(outputs[-1], weights['out']) + biases['out']  

     return results 

pred = RNN(x, weights, biases) # prediction 

は今、私はLSTM細胞の1つの以上の層を追加したいです。 Tensorflowの公式サイトの例をチェックしました。 https://www.tensorflow.org/tutorials/recurrent

しかし、私はMultiRNNCellをどのように使うことができるかを考え出すのに苦労しました。私は、共通のニューラルネットワークと同じロジックを使用して、最初の層の出力にプラスのバイアスを掛けて、2番目の層に送信してみました。次のコードでは、これを実装しています。

# Define weights 
weights1 = { 
    'in': tf.Variable(tf.random_normal([n_inputs, n_hidden_units])), 
    'out': tf.Variable(tf.random_normal([n_hidden_units, n_hidden_units])) 
} 
biases1 = { 
    'in': tf.Variable(tf.constant(0.1, shape=[n_hidden_units, ])), 
    'out': tf.Variable(tf.constant(0.1, shape=[n_hidden_units, ])) 
} 

weights2 = { 
    'in': tf.Variable(tf.random_normal([n_inputs, n_hidden_units])), 
    'out': tf.Variable(tf.random_normal([n_hidden_units, n_classes])) 
} 
biases2 = { 
    'in': tf.Variable(tf.constant(0.1, shape=[n_hidden_units, ])), 
    'out': tf.Variable(tf.constant(0.1, shape=[n_classes, ])) 
} 



def RNN(X, weights1, biases1, weights2, biases2): 

    X = tf.reshape(x, [-1, n_inputs]) 
    X_in = tf.matmul(X, weights1['in']) + biases1['in'] 
    X_in = tf.reshape(X_in, [-1, n_steps, n_hidden_units]) 

    lstm_cell1 = tf.contrib.rnn.BasicLSTMCell(n_hidden_units) 
    lstm_cell2 = tf.contrib.rnn.BasicLSTMCell(n_hidden_units) 

    init_state1 = lstm_cell1.zero_state(batch_size_holder, dtype=tf.float32) 
    init_state2 = lstm_cell2.zero_state(batch_size_holder, dtype=tf.float32) 

    outputs1, final_state1 = tf.nn.dynamic_rnn(lstm_cell1, X_in, initial_state=init_state1, time_major=False) 

    outputs1 = tf.unstack(tf.transpose(outputs1, [1,0,2])) 
    results1 = tf.matmul(outputs1[-1], weights1['out']) + biases1['out']  

    input = tf.matmul(results1, weights2['in']) + biases2['in'] 
    input = tf.reshape(input, [-1, n_steps, n_hidden_units]) 
    outputs2, final_state2 = tf.nn.dynamic_rnn(lstm_cell2, input, initial_state=init_state2, time_major=False) 

    outputs2 = tf.unstack(tf.transpose(outputs2, [1,0,2])) 
    results2 = tf.matmul(outputs2[-1], weights2['out']) + biases2['out']  


    return results2 

同じサイズのlstm_cellsを2つ作成し、dynamic_rnnを2回呼び出します。

私の最初の質問は、このコードは私がしたいことですか?

とValueError:変数RNN/basic_lstm_cell /ウェイトがすでに存在している、許可されていない実行している場合

、私はn個のエラーを得ました。 VarScopeでreuse = Trueを設定することを意味しましたか? Tensorflowによれば

、(https://www.tensorflow.org/tutorials/recurrent) このバージョンの問題であり、BasicLSTMCellにreuse=tf.get_variable_scope().reuse パラメータを追加することによって解決されるべきです()。

しかし、私のBasicLSTMCell()関数には "再利用"パラメータがありません。

あなたはそれを動作させる方法を知っていますか?どんな助言や助けもありがとうございます。

完全なコードは以下の通りである:ビジェイの答えに

import tensorflow as tf 


lr = 0.005 

n_inputs = 128 
n_steps = 255 
n_hidden_units = 128 
number_of_layers = 2 
n_classes = 1  
batch_size = 100 
gradient = 0.1 

# tf Graph input 
x = tf.placeholder(tf.float32, [None, n_steps, n_inputs]) 
y = tf.placeholder(tf.float32, [None, n_classes]) 
batch_size_holder = tf.placeholder(tf.int32, [], name='batch_size_holder') 


# Define weights 
weights = { 
    'in': tf.Variable(tf.random_normal([n_inputs, n_hidden_units])), 
    'out': tf.Variable(tf.random_normal([n_hidden_units, n_classes])) 
} 
biases = { 
    'in': tf.Variable(tf.constant(0.1, shape=[n_hidden_units, ])), 
    'out': tf.Variable(tf.constant(0.1, shape=[n_classes, ])) 
} 


def RNN(X, weights, biases): 

    X = tf.reshape(X, [-1, n_inputs]) 

    X_in = tf.matmul(X, weights['in']) + biases['in'] 
    X_in = tf.reshape(X_in, [-1, n_steps, n_hidden_units]) 

    lstm_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden_units) 

    init_state = lstm_cell.zero_state(batch_size_holder, dtype=tf.float32) 

    outputs, final_state = tf.nn.dynamic_rnn(lstm_cell, X_in, initial_state=init_state, time_major=False) 

    outputs = tf.unstack(tf.transpose(outputs, [1,0,2])) 
    results = tf.matmul(outputs[-1], weights['out']) + biases['out'] # shape = (128, 10) 

    return results 


pred = RNN(x, weights, biases) 
cost = tf.reduce_mean(tf.square(pred-y)) 
optimizer = tf.train.AdamOptimizer(lr) 
gvs = optimizer.compute_gradients(cost) 
capped_gvs = [(tf.clip_by_value(grad, -gradient, gradient), var) for grad, var in gvs] 
train_step = optimizer.apply_gradients(capped_gvs) 

sess = tf.Session() 

init = tf.global_variables_initializer() 
sess.run(init) 

mydata = data(batch = batch_size, s = 10000, per = 0.95) 
step = 0 
train_loss = [] 
test_loss = [] 
while mydata.hasNext(): 
    batch_xs, batch_ys = mydata.next() 
    batch_xs = batch_xs.reshape([batch_size, n_steps, n_inputs]) 
    batch_ys = batch_ys.reshape([batch_size, 1]) 

    sess.run(train_step, feed_dict={ 
     x: batch_xs, 
     y: batch_ys, 
     batch_size_holder : 100 
    }) 
    if step % 10 == 0: 
     test_x, test_y = mydata.test() 
     test_x = test_x.reshape([-1, n_steps, n_inputs]) 
     test_y = test_y.reshape([-1, 1]) 
     loss1 = sess.run(cost, feed_dict = {x : batch_xs, y: batch_ys, batch_size_holder : 100}) 
     loss2 = sess.run(cost, feed_dict = {x : test_x, y : test_y, batch_size_holder : 500}) 
     train_loss.append(loss1) 
     test_loss.append(loss2) 

     print("training cost: ", loss1) 
     print("testing cost: ", loss2) 
    step += 1 

sess.close() 
import matplotlib.pyplot as plt 
plt.plot(train_loss) 
plt.plot(test_loss) 

-------更新---------

おかげで、更新されたコードは、

結果を出力する前に、ネットワークに2(n_layer)のLSTMレイヤーと1つの稠密レイヤーがあることに注意してください。

import tensorflow as tf 


lr = 0.01 
n_inputs = 128 
n_steps = 255 
n_hidden_units = 200 
n_layers = 2 
number_of_layers = 2 
n_classes = 1 
batch_size = 100 
gradient = 0.5 


# tf Graph input 
x = tf.placeholder(tf.float32, [None, n_steps, n_inputs]) 
y = tf.placeholder(tf.float32, [None, n_classes]) 
batch_size_holder = tf.placeholder(tf.int32, [], name='batch_size_holder') 


def lstm_cell():   
    return tf.contrib.rnn.BasicLSTMCell(n_hidden_units) 

def RNN(X): 

    lstm_stacked = tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(n_layers)]) 
    init_state = lstm_stacked.zero_state(batch_size_holder, dtype=tf.float32) 
    outputs, final_state = tf.nn.dynamic_rnn(lstm_stacked, X, dtype=tf.float32) 

    output = tf.layers.dense(outputs[:, -1, :], 1) 

    return output 


pred = RNN(x) 
cost = tf.losses.mean_squared_error(y, pred) 
optimizer = tf.train.AdamOptimizer(lr) 
gvs = optimizer.compute_gradients(cost) 
capped_gvs = [(tf.clip_by_value(grad, -gradient, gradient), var) for grad, var in gvs] 
train_step = optimizer.apply_gradients(capped_gvs) 

sess = tf.Session() 

init = tf.global_variables_initializer() 
sess.run(init) 

mydata = data(batch = batch_size, s = 30000, per = 0.95) 
step = 0 
train_loss = [] 
test_loss = [] 
while mydata.hasNext(): 
    batch_xs, batch_ys = mydata.next() 
    batch_xs = batch_xs.reshape([batch_size, n_steps, n_inputs]) 
    batch_ys = batch_ys.reshape([batch_size, 1]) 

    sess.run(train_step, feed_dict={ 
     x: batch_xs, 
     y: batch_ys, 
     batch_size_holder : batch_size 
    }) 
    if step % 10 == 0: 
     test_x, test_y = mydata.test() 
     test_x = test_x.reshape([-1, n_steps, n_inputs]) 
     test_y = test_y.reshape([-1, 1]) 
     loss1 = sess.run(cost, feed_dict = {x : batch_xs, y: batch_ys, batch_size_holder : batch_size}) 
     loss2 = sess.run(cost, feed_dict = {x : test_x, y : test_y, batch_size_holder : 1500}) 
     train_loss.append(loss1) 
     test_loss.append(loss2) 

     print("training cost: ", loss1, "testing cost: ", loss2) 

    step += 1 

答えて

1

あなたがtf.contrib.rnn.MultiRNNCellを使用することができますmulti-layer LSTMをしたい場合。だから2層の場合:

n_layers = 2 
lstm_stacked = tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(n_layers)]) 
outputs, final_state = tf.nn.dynamic_rnn(lstm_stacked, X_in, dtype=tf.float32) 

def lstm_cell():   
    # Single RNN cell 
    return tf.contrib.rnn.BasicLSTMCell(n_hidden_units) 
+0

それは簡単だとは思いません!どのように各レイヤーのウェイト、バイアス、初期状態を設定するのですか? dynamic_rnnを実行するには? – David

+0

バイアス、ウェイトは内部的に関数で処理されます。初期状態を渡す場合は、dynamic_rnnにparamを使用できます。上記のコードには 'dynamic_rnn'呼び出しが含まれています。 –

+0

元のコードでは、重みと偏りの定義は必要ではなく、間違っていますか?私は 'X_in = tf.matmul(X、weights ['in'])+バイアス['in']'をしてはいけませんか? (tf.Variable(tf.random_normal([n_inputs、n_hidden_​​units]))の の重み= { ')、 '出力 ':tf.Variable(tf。 バイアス= { '':tf.Variable(tf.constant(0.1、shape = [n_hidden_​​units、]))、 'out':tf.Variable(tf.Variable(tf。 } ' – David

関連する問題