2016-02-26 15 views
6

Ipython'da tensorflow as tf ve numpy as np öğelerini içe aktardım ve bir TensorFlow InteractiveSession oluşturdu. Koşuyorum ya numpy girişi olan bazı normal dağılım başlatılıyor am zaman , her şey iyi çalışır:TensorFlow: rasgele bir sabit oluşturma

some_test = tf.constant(np.random.normal(loc=0.0, scale=1.0, size=(2, 2))) 
session.run(some_test) 

İade:

array([[-0.04152317, 0.19786302], 
     [-0.68232622, -0.23439092]]) 

beklendiği gibi. Ben Tensorflow normal dağılım işlevini kullandığınızda

... ama:

(...) 
TypeError: List of Tensors when single Tensor expected 

Burada ne eksik:

some_test = tf.constant(tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32)) 
session.run(some_test) 

... o söyleyerek Tip hata yükseltir?

çıktısı:

sess.run(tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32)) 

tek başına np.random.normal oluşturur aynısını geri - bir normal dağılım alınan değerleri ile şekil (2, 2) arasında> bir matris.

cevap

8

tf.constant() op numpy dizisini (veya bir numpy dizisine dolaylı olarak dönüştürülebilir bir şey) alır ve değeri bu diziyle aynı olan bir tf.Tensor değerini döndürür. ,'u bağımsız değişken olarak tf.Tensor kabul etmez.

Diğer yandan, tf.random_normal() op, her çalıştırıldığında verilen dağılıma göre rasgele oluşturulmuş bir tf.Tensor döndürür. Bir tf.Tensor döndürdüğünden, tf.constant() için argüman olarak kullanılamaz. Bu, TypeError açıklar (bu, grafiği oluşturduğunuzda ortaya çıktığı için tf.InteractiveSession kullanımıyla ilgisi yoktur).

Grafiğinizin (i) ilk kullanımında rastgele oluşturulduğu ve (ii) daha sonra sabit bir tensör içermesini istediğinizi varsayalım. Eğer söz konusu olduğu gibi

  1. Kullanım NumPy rastgele bir değer oluşturmak ve tf.constant() koymak,: Bunu yapmanın iki yolu vardır

    some_test = tf.constant(
        np.random.normal(loc=0.0, scale=1.0, size=(2, 2)).astype(np.float32)) 
    
  2. (Potansiyel hızlı, bunun yanı rasgele bir değer üretmek üzere kullanımı TensorFlow) rasgele sayılar üretmek için GPU'yu kullanımı ve tf.Variable içine konabilir:

    some_test = tf.Variable(
        tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32) 
    sess.run(some_test.initializer) # Must run this before using `some_test` 
    
+2

Açıklama için teşekkürler! Bu yüzden "tf.Variable" kullanmam gerektiğinde GPU hızlandırması "ras" tensorflow rasgele "sabit" almak için ?! – daniel451

+0

Evet, bu mantıklı değil mi? :) Sorun şu ki, TF'de, "değişken" ve "başlatılabilir" kavramları aynı türden bir araya getirilmiştir - zaman zaman başlatmanın daha iyi yollarını tartışmıştık (örneğin C- 'deki bazı statik başlatmalar eşdeğerdir. diller gibi), ama henüz bir tasarıma yerleşmediniz.(Böyle bir şeyin sabit katlama, vb. Gibi optimizasyonlar için nasıl yararlı olacağını hayal edebilirsiniz.) – mrry

+1

Yanıt için teşekkürler @mrry. Aynı şeyi yapmaya çalışıyorum ama bundan sonra "some_test" değerini sabit tutmak istemiyorum, seçenek 2 ile aynı şeyi yapardım ama "sess.run (some_test.initializer)" ifadesini içermez miydim? – bnorm