2016-05-25 47 views
20

Bu genel bir sorundur. Tensorflowda, grafiği oluşturduktan sonra, verileri grafiğe getirdikten sonra, grafikten elde edilen çıkışın bir tensör olduğunu buldum. fakat çoğu durumda, bu çıkışa dayalı olarak bir hesaplama yapmamız gerekiyor (bu, tensor), ki bu da tensorflow'a izin verilmiyor. Örneğin, veri öz özelliklerine göre zamana bağlı olan bir RNN'yi uygulamaya çalışıyorum. Yani, durmam gerekip gerekmediğini yargılamak için bir tensor kullanmam gerekiyor (tasarımımdan beri dynamic_rnn kullanmıyorum, rnn son derece özelleştirildi). Uygulamam için tf.while_loop(cond,body.....) bir aday olabilir. Ancak resmi eğitici çok basit. 'Beden'e' daha fazla işlevsellik eklemeyi bilmiyorum. Birisi bana daha karmaşık bir örnek verebilir mi? Böyle bir durumda, gelecekteki hesaplama, tensör çıkışına (örn: çıkış kriteri temel alınarak RNN ​​durağına) dayanıyorsa, bu çok yaygın bir durumdur. Dinamik grafik yerine zarif bir yol ya da daha iyi bir yol var mı?tf_while_loop() tensorflow içinde nasıl kullanılır

cevap

29

Vücuda daha fazla işlevsellik eklemekten ne engelliyorsunuz? Vücudunuzda istediğiniz karmaşık hesaplama grafiğini oluşturabilir ve kapsanan grafikten istediğiniz girdileri alırsınız. Ayrıca, döngü dışında, geri döndüğünüz çıktılar ile istediğiniz her şeyi yapabilirsiniz. “Whatevers” miktarından da görebileceğiniz gibi, TensorFlow'un kontrol akışı ilkelleri çok genel bir bakış açısıyla inşa edildi. Aşağıda yardımcı olması durumunda başka bir 'basit' örnek.

import tensorflow as tf 
import numpy as np 

def body(x): 
    a = tf.random_uniform(shape=[2, 2], dtype=tf.int32, maxval=100) 
    b = tf.constant(np.array([[1, 2], [3, 4]]), dtype=tf.int32) 
    c = a + b 
    return tf.nn.relu(x + c) 

def condition(x): 
    return tf.reduce_sum(x) < 100 

x = tf.Variable(tf.constant(0, shape=[2, 2])) 

with tf.Session(): 
    tf.initialize_all_variables().run() 
    result = tf.while_loop(condition, body, [x]) 
    print(result.eval()) 
+0

İyi bir açıklama. Benim problemim, 'vücut' bir kez çalıştırdıktan sonra hesaplanan 'koşul'. Bu yüzden bedenin dönüş değerini 'koşul' için bir parametre olarak kullanmam gerekiyor. –

+5

Ne istiyorsan tam olarak ne olduğunu. Döngü 'iken (koşul (tensörler)) {tensörler = vücut (tensörler); } ', böylece, geçtiğiniz tensörler her seferinde vücut tarafından döndürülen tensörler için güncellenir ve daha sonra bu güncellenmiş tensörler" koşula "geçirilir. 'Kasa' denen tek zaman 'bed' den önce * çok ilk kez *, yukarıda sözde kod döngüsünün gövdesi girilir. Ancak, bu durumda, sadece 'loop_vars' içinde geçtiğiniz tensörleri doğru şekilde başlatmakla ilgilidir. Örneğin, "body" sonucunu "loop_vars" tensörleri olarak "while_loop" olarak iletebilirsiniz. –

+0

oh, "loop_vars" ile "while_loop" işlev tanımını, yani while_loop (koşul, gövde, loop_vars) 'dır (onun" koşul "ve" vücut "durumuna geçen tensörler) –