2017-05-04 15 views
6

私はPython API for Tensorflowを使用しています。私は、Pythonのループを使用せずに下記のRosenbrock functionを実装しようとしています:Tensorflowでwhileループを理解する

Rosenbrock function

次のように私の現在の実装は次のとおりです。

def rosenbrock(data_tensor): 
    columns = tf.unstack(data_tensor) 

    summation = 0 
    for i in range(1, len(columns) - 1): 
     first_term = tf.square(tf.subtract(columns[i + 1], tf.square(columns[i]))) 
     second_term = tf.square(tf.subtract(columns[i], 1.0)) 
     summation += tf.add(tf.multiply(100.0, first_term), second_term) 

    return summation 

私はtf.while_loop()で和を実装しようとしています。しかし、データとは別のインデックスの整数を使用する場合、APIはやや直感的ではないことがわかりました。 documentationに示す例では、インデックス(またはその逆)のようなデータを使用する:

i = tf.constant(0) 
c = lambda i: tf.less(i, 10) 
b = lambda i: tf.add(i, 1) 
r = tf.while_loop(c, b, [i]) 
+0

forループを使用するのが適切ですか? while_loopを使用する利点は何ですか?それとも必要ですか? – lerner

+0

上記のコードでは、forループはPythonコードを実行します。私たちがforループの本体を "f"と呼んだ場合、Pythonコードをf、f、f、f、f、... fのように考えることができます。だから、それは "ボディ"関数をN回呼び出すので、関数のグラフはその関数をN回持つことになります。 tf.while_loopを使用すると、その関数はグラフ内で1回しか表示されません。 –

+0

tf.while_loopの利点は、1)反復を並行して実行できること、2)条件文に実行時定数を持たせることができることです。たとえば、一定の許容値が満たされるまで最適化を実行する場合、pythonは最初に条件 –

答えて

10

これは、documentationにおける第二の例に従ってtf.while_loop()標準tuplesを用いて達成することができます。

def rosenbrock(data_tensor): 
    columns = tf.unstack(data_tensor) 

    # Track both the loop index and summation in a tuple in the form (index, summation) 
    index_summation = (tf.constant(1), tf.constant(0.0)) 

    # The loop condition, note the loop condition is 'i < n-1' 
    def condition(index, summation): 
     return tf.less(index, tf.subtract(tf.shape(columns)[0], 1)) 

    # The loop body, this will return a result tuple in the same form (index, summation) 
    def body(index, summation): 
     x_i = tf.gather(columns, index) 
     x_ip1 = tf.gather(columns, tf.add(index, 1)) 

     first_term = tf.square(tf.subtract(x_ip1, tf.square(x_i))) 
     second_term = tf.square(tf.subtract(x_i, 1.0)) 
     summand = tf.add(tf.multiply(100.0, first_term), second_term) 

     return tf.add(index, 1), tf.add(summation, summand) 

    # We do not care about the index value here, return only the summation 
    return tf.while_loop(condition, body, index_summation)[1] 

インデックスの増分は、標準whileループと同様にループの本体で発生する必要があることに注意することが重要です。与えられた解では、body()関数が返すタプルの最初の項目です。

さらに、この特定の例では使用されていませんが、ループ条件関数は合計のパラメータを割り当てる必要があります。

関連する問題