2016-12-27 15 views
6

私が例からTensorFlowを勉強しています:なぜ我々はする必要はありませんでした、X、Y、W、aとbのようなプレースホルダや変数を定義する場合 :私は以下のコードでいくつかの質問を持っているhttps://github.com/aymericdamien/TensorFlow-Examples/blob/master/notebooks/2_BasicModels/linear_regression.ipynbTensorFlow:tf.placeholderとtf.Variable - ディメンションは必須ではないのはなぜですか?

それらの次元を指定しますか?これらのプレースホルダー/変数のサイズを知らなくても、コードはどのようにしてメモリを割り当てますか?ありがとう!

# tf Graph Input 
    X = tf.placeholder("float") 
    Y = tf.placeholder("float") 

    # Set model weights 
    W = tf.Variable(rng.randn(), name="weight") 
    b = tf.Variable(rng.randn(), name="bias") 


    # Construct a linear model 
    pred = tf.add(tf.mul(X, W), b) 

答えて

6

TensorFlowのtf.placeholder()テンソルは後でtf.Session.run()呼び出しで異なる形状のフィードテンソルにあなたを可能にするために、形状を指定する必要はありません。既定では、プレースホルダの形状は完全に制約されていませんが、オプションのshape引数を渡して制約できます。例:

w = tf.placeholder(tf.float32)      # Unconstrained shape 
x = tf.placeholder(tf.float32, shape=[None, None]) # Matrix of unconstrained size 
y = tf.placeholder(tf.float32, shape=[None, 32]) # Matrix with 32 columns 
z = tf.placeholder(tf.float32, shape=[128, 32])  # 128x32-element matrix 

プレースホルダを作成すると、TensorFlowはメモリを割り当てません。代わりに、tf.Session.run()の呼び出しで、プレースホルダを入力すると、TensorFlowは適切なサイズのメモリを入力に割り当てます(その後、必要な中間のテンソルを割り当てます)。

tf.Variableオブジェクトは通常、オブジェクトを作成するときにシェイプが必要であり、このシェイプはイニシャライザの最初の引数から推定されます。あなたのプログラムでは、rng.randn()(別名numpy.random.randn())はスカラー値を返します。したがって、変数Wbはスカラー形状になります。あなたのコード内のプレースホルダが、

XY)、などtf.add()tf.mul()として拘束されていない形状、オペレータのいくつかを、持っているその引数の形状に関する追加要件持つ(すなわちを。彼らはNumPy broadcasting rulesと互換性があること) 。 TensorFlowは、グラフの作成時にテンソルの実際の形状がどのようなものになるかを知らないため、ユーザーは自分が行っていることを知っていることを信頼し、動的にチェックします(tf.Session.run()の呼び出し中)。代わりにプレースホルダの形状を制約する場合は、TensorFlowで事前にいくつかのチェックを実行できるようにし、これを行うとバグを減らすことができます。

+0

ありがとうございます!変数ケースはどうですか? – Edamame

+0

あなたはそれについても尋ねているのを見ました...私は説明する答えを更新しました。 – mrry

+0

私はhttps://github.com/aymericdamien/TensorFlow-Examples/blob/master/notebooks/2_BasicModels/linear_regression.ipynbのコードを読んでいます。変数Wはスカラーではなく配列です。それを間違って理解していますか?ありがとう! – Edamame

関連する問題