2017-09-13 5 views
1

標準のTensorFlow演算子を使用して、昇順に値を持つ1Dテンソルを1Dテンソルに変換するにはどうすればよいですか?各値は、左から順にスキャンするときに入力テンソルの同じインデックスの値が現れる回数右? 例題は質問タイトルに記載されています。[0,0,0,1,2,2]を[0,1,2,0,0,1]に変換する方法ですか?

+0

これまでに何を試しましたか? – Verv

+0

問題の説明がどのようにこの例を生成するかはわかりません。出力の最初の値を取る。 「入力テンソルの同じインデックスの値」は0(入力テンソルの最初の値)です。 0は、スキャンを開始する場所に応じて、「左から右へスキャンするときは入力テンソルで」2または3回表示されます。したがって、出力テンソルの最初の値は、0ではなく2または3のいずれかでなければなりません。代わりに右から左にスキャンすると、この例がどのように生成されるかがわかります。それはあなたが欲しいものですか? – iga

答えて

0

tf.while_loopを使用してこれを達成できます。私は次の解決策を提案します:

import tensorflow as tf 


def scan_accum(a): 
    def condition(a): 
     def c(counts, acc, i): 
      return tf.less(i, tf.gather(tf.shape(a), 0)) 
     return c 

    def body(a): 
     def b(counts, acc, i): 
      current = tf.gather(a, i) 
      ant = tf.gather(a, tf.add(i, -1)) 
      update = tf.scatter_nd(tf.reshape(i, shape=(1, 1)), 
            tf.expand_dims(acc, axis=0), 
            shape=tf.shape(counts)) 
      counts_ = tf.cond(
       pred=tf.equal(current, ant), 
       true_fn=lambda: counts + update, 
       false_fn=lambda: counts 
      ) 
      acc_ = tf.cond(
       pred=tf.equal(current, ant), 
       true_fn=lambda: tf.add(acc, 1), 
       false_fn=lambda: tf.constant(1, dtype=counts.dtype) 
      ) 
      i_ = tf.add(i, 1) 
      return [counts_, acc_, i_] 
     return b 

    i = tf.constant(1) 
    counts = tf.zeros_like(a) 
    acc = tf.constant(1, dtype=counts.dtype) 
    counts, _, _ = tf.while_loop(cond=condition(a), 
           body=body(a), 
           loop_vars=[counts, acc, i]) 
    return counts 

a = tf.constant([0, 0, 0, 1, 2, 2]) 
with tf.Session() as sess: 
    print(sess.run(scan_accum(a))) # prints [0 1 2 0 0 1] 
関連する問題