2017-07-10 8 views
0

私が見たすべてのTensorFlowの例では、プレースホルダを使用してグラフにデータを入力しています。しかし、私のアプリケーションは、プレースホルダなしで正常に動作します。 documentationによれば、プレースホルダを使用することが「ベストプラクティス」ですが、コードを不必要に複雑にするようです。プレースホルダはいつ必要ですか?

プレースホルダが絶対に必要な場合はありますか?

+1

プレースホルダなしでアプリケーションが正常に動作する場所の例を表示できますか? – stackoverflowuser2010

答えて

2

プレースホルダーは、値を後で提供することが約束されています。 単純な例では、2つのプレースホルダa、bを定義し、次にそれらの操作を以下のように定義します。

a = tf.placeholder(tf.float32) 
b = tf.placeholder(tf.float32) 
adder_node = a + b # + provides a shortcut for tf.add(a, b) 

a,bは初期化され、それらはプレースホルダとして定義されていたのでデータは含まれていませんされていません。

同じことを行う他の方法は、変数tf.Variableを定義することです。この場合、宣言時に初期値を指定する必要があります。以下のような :

tf.global_variables_initializer() 

または

tf.initialize_all_variables() 

、この溶液を2つの欠点

  • パフォーマンスが賢明なあなたが 初期化子を呼び出すと1つの余分な手順を実行する必要があることが、これらの変数は更新されています。

  • プレースホルダ

結論としてそれを定義する必要がありますので、いくつかのケースでは、あなたは これらの変数の初期値を知らない:学習可能なため

  • 使用tf.Variableモデルの重み(W)やバイアス(B)などの変数、または 一般に初期値が必要な場合。

  • tf.placeholderを使用すると、データを必要とせずに操作を作成し、計算グラフを作成できます。 TensorFlow の用語では、これらの のプレースホルダーを通じてデータをグラフに送ります。

+0

初期値が必要な場合は小規模な修正が必要ですが、トレーニングに値を変更したくない場合は、 'tf.constant'を使うのが賢明でしょう。 –

+0

@OferSadanはい、あなたは正しいですが、変数とプレースホルダの間。 –

0

私は本当にアーメドの答えのように、私はそれをupvotedが、私は、ビット明確に物事をしない場合があります別の説明を提供したいと思います。

Tensorflowの重要な機能の1つは、操作グラフがコンパイルされ、それらを構築するために使用された元の環境の外で実行されることです。これにより、Tensorflowは、分散型、プラットフォーム非依存型、グラフ相互運用性、GPU計算などのあらゆる種類のトリックと最適化を行うことができます。しかし、このすべては複雑さを犠牲にしています。あなたのグラフはある種の独自のVMの中で実行されているので、例えばpythonプログラムのように外部からデータを供給する特別な方法が必要です。

プレースホルダが入る場所です。モデルにデータを入力する1つの方法は、グラフ演算を実行するときにフィード辞書を使用してデータを供給することです。そして、このデータがグラフのどこにあるかを示すために、プレースホルダを使用します。 Ahmedが述べたように、この方法では、プレースホルダは将来提供されるデータのための約束のようなものです。文字通り後で提供するもののプレースホルダです。アーメドさん

 
# define graph to do matrix muliplication 
x = tf.placeholder(tf.float32) 
y = tf.placeholder(tf.float32) 
# this is the actual operation we want to do, 
# but since we want to supply x and y at runtime 
# we will use placeholders 
model = tf.matmul(x, y) 

# now lets supply the data and run the graph 
init = tf.global_variables_initializer() 

with tf.Session() as session: 
    session.run(init) 
    # generate some data for our graph 
    data_x = np.random.randint(0, 10, size=[5, 5]) 
    data_y = np.random.randint(0, 10, size=[5, 5]) 
    # do the work 
    result = session.run(model, feed_dict={x: data_x, y: data_y} 

と同様の例を使用するためにあり、グラフにデータを供給する他の方法がありますが、間違いなく、プレースホルダとfeed_dictは最もわかりやすい方法であり、それは最も柔軟性を提供します。

プレースホルダを避けたい場合は、グラフビルドの定数にデータセット全体をロードする方法と、入力パイプラインを使用してグラフにデータをロードして前処理する全プロセスを移動する方法があります。これについては、TFのドキュメントで読むことができます。

https://www.tensorflow.org/programmers_guide/reading_data

2

は、ドキュメントによると、プレースホルダを使用すると、この引用は、外のコンテキストであると誤って解釈される可能性が、「ベストプラクティス」の

ホールドです。プレースホルダは、データをfeed_dictに渡すときのベストプラクティスです。

プレースホルダを使用すると、意図が明確になります。これは、フィードを必要とする入力ノードです。 Tensorflowはさらにplaceholder_with_defaultを提供し、が必要ではないが、このようなノードの意図は明らかである。すべての目的のために、placeholder_with_defaultconstantと同じことを行います。実際にはconstantにその値を変更することはできますが、それは明らかです。私はそうは思わない。

摂食とAFAICS以外の方法でデータを入力する方法はすべてあります。

関連する問題