2016-02-26 26 views
6

ipythonでは、私はtensorflow as tfnumpy as npをインポートし、TensorFlow InteractiveSessionを作成しました。私が実行しているか、numpyの入力といくつかの正規分布を初期化していた場合 、すべてが正常に動作します:TensorFlow:ランダム定数を生成する

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

戻り値:

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

期待と同じように。

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

が、私はここで何をしないのです:?それは言っ型エラーを発生

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

...:

...しかし、私はTensorflow正規分布関数を使用しますか

の出力: - 正規分布から取られた値を持つ形状(2, 2)の>マトリックス単独

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

np.random.normalが生成全く同じものを返します。

答えて

8

opはnumpy配列(またはnumpy配列に暗黙的に変換可能なもの)をとり、その値がその配列と同じtf.Tensorを返します。 ではなく、を引数としてtf.Tensorを受け入れます。

一方、tf.random_normal() opは、実行するたびに指定されたディストリビューションに従って値がランダムに生成されるtf.Tensorを返します。 tf.Tensorを返すので、tf.constant()の引数として使用することはできません。これは、の使用に関係しないTypeErrorについて説明しています。これは、グラフの作成時に発生するためです。

私は、(i)最初の使用時にランダムに生成されたテンソルと、その後の定数をグラフに含めたいとします。これを行うには2つの方法があります。

  1. 使用numpyのあなたは、あなたの質問に行ったように、ランダムな値を生成し、tf.constant()にそれを置くために:

    それとして潜在的に速く
    some_test = tf.constant(
        np.random.normal(loc=0.0, scale=1.0, size=(2, 2)).astype(np.float32)) 
    
  2. (、ランダムな値を生成するために使用TensorFlow)乱数を生成するためにGPUを使用し、tf.Variableにそれを置くことができます。

    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

説明をありがとう!ですから、ランダムな「定数」を得るために、GPUアクセラレーションを別名「純粋な」テンソルフローにしたいときは、 'tf.Variable'を使用する必要があります。 – daniel451

+0

はい、直観に反しますね。 :)問題は実際には、TFで、 "可変"と "初期化可能"という概念が同じ型で結合されていることです - 時には初期化を行うためのより良い方法について議論しました(例えばC-似たような言語)が、デザインにはまだ解決していません。(定数フォールディングなどの最適化にどのように役立つのか想像することができます) – mrry

+1

応答@mrryをありがとう。私は同じことをしようとしているが、 'some_test'をその後も一定にしたくない場合は、オプション2と同じことをしますが、' sess.run(some_test.initializer) 'は含めません。 – bnorm

関連する問題