2015-12-22 29 views
15

テンソルフローで最小のおもちゃRNNの例を実装しようとしています。 目標は、入力データからターゲットデータへのマッピングを学習することです。これは、このすばらしい簡潔さと同じようにexample in theanetsです。テンソルフローにおける最小RNNの例

更新:私たちはそこに着いています。残っているのは、それを収束させる(そして畳み込みを少なくする)ことだけです。次のコードを実行コードに変換したり、簡単な例を提供するのに役立つだろうか?

import tensorflow as tf 
from tensorflow.python.ops import rnn_cell 

init_scale = 0.1 
num_steps = 7 
num_units = 7 
input_data = [1, 2, 3, 4, 5, 6, 7] 
target = [2, 3, 4, 5, 6, 7, 7] 
#target = [1,1,1,1,1,1,1] #converges, but not what we want 


batch_size = 1 

with tf.Graph().as_default(), tf.Session() as session: 
    # Placeholder for the inputs and target of the net 
    # inputs = tf.placeholder(tf.int32, [batch_size, num_steps]) 
    input1 = tf.placeholder(tf.float32, [batch_size, 1]) 
    inputs = [input1 for _ in range(num_steps)] 
    outputs = tf.placeholder(tf.float32, [batch_size, num_steps]) 

    gru = rnn_cell.GRUCell(num_units) 
    initial_state = state = tf.zeros([batch_size, num_units]) 
    loss = tf.constant(0.0) 

    # setup model: unroll 
    for time_step in range(num_steps): 
    if time_step > 0: tf.get_variable_scope().reuse_variables() 
    step_ = inputs[time_step] 
    output, state = gru(step_, state) 
    loss += tf.reduce_sum(abs(output - target)) # all norms work equally well? NO! 
    final_state = state 

    optimizer = tf.train.AdamOptimizer(0.1) # CONVERGEs sooo much better 
    train = optimizer.minimize(loss) # let the optimizer train 

    numpy_state = initial_state.eval() 
    session.run(tf.initialize_all_variables()) 
    for epoch in range(10): # now 
    for i in range(7): # feed fake 2D matrix of 1 byte at a time ;) 
     feed_dict = {initial_state: numpy_state, input1: [[input_data[i]]]} # no 
     numpy_state, current_loss,_ = session.run([final_state, loss,train], feed_dict=feed_dict) 
    print(current_loss) # hopefully going down, always stuck at 189, why!? 
+0

おそらく、チュートリアルから始まり、実際のコードからコードを開発する方がよいでしょう。https://www.tensorflow.org/versions/master/tutorials/recurrent/index.html – GavinBrelstaff

+3

コード*はチュートリアルから*です。 ptb_word_lm.pyには322行があります – Anona112

+1

Redditスレッドhttps://www.reddit.com/r/MachineLearning/comments/3sok8k/tensorflow_basic_rnn_example_with_variable_length/テンソルフローがまだRNNの準備ができていないことを示唆しています私は実際にそれをテストしたいと思っていますが、ドライブをテストするための作業コードはありません。 – GavinBrelstaff

答えて

6

あなたのコードにはいくつか問題があると思いますが、その考えは正しいです。

主な問題は、
inputs = tf.placeholder(tf.int32, [batch_size, num_steps])のように、入力と出力に単一のテンソルを使用していることです。

TensorFlowでは、RNN関数はテンソルのリストを取ります(いくつかのモデルではnum_stepsが異なる可能性があるため)。あなたはこのような入力を構築する必要がありますので、: - それはembedding_lookupが何のためにあるのかだ
inputs = [tf.placeholder(tf.int32, [batch_size, 1]) for _ in xrange(num_steps)]

次に、あなたの入力がint32sですが、RNNセルがフロートベクトル上で動作するという事実の世話をする必要があります。

最後に、フィードを入力リストに入れるように調整する必要があります。

私はptbチュートリアルを見るのが妥当な場所だと思っていますが、すぐに使用できるRNNのさらに小さな例が必要な場合は、rnn単体テストのいくつかを見てください。ここに。 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/kernel_tests/rnn_test.py#L164

+0

あなたの提案に感謝します!それらを実装すると、実行中のコードが生成されます(それでもまだまだ複雑です)。残っているのはそれを収束させることだけです。 – Anona112

関連する問題