以前、TensorFlowの計算グラフ内で変数を使用できるtf.Variableを紹介しました。

TensorFlowの計算グラフ内の変数tf.Variableの使い方 /tensorflow/2017/06/02/tensorflow-variable.html

tf.placeholderは、事前に変数の値を定義する必要のない、計算グラフ内の変数の容れ物のような扱いになります。tf.placeholderの使い方をマスターすると、実行時に任意の値を入れてTensorFlowに計算させることができるようになります。

この記事を通して、使い方をマスターしてください。

APIドキュメント

まずはAPIドキュメントを確認してみましょう。

tf.placeholder(dtype, shape=None, name=None)

params:

パラメータ名 概要
dtype Tensorの型 変数に代入される型を指定します
shape TensorShape 割り当てる変数のshape。もしshapeが指定されていなければ、任意のshapeの変数を割り当てることができます
name string 変数の名前。デフォルトでは自動でユニークな名前を割り当てます。

returns:

直接評価されない、feedされる変数のTensorを返します。

dtypeに使用する型を指定する必要があります。

具体的な使用例

具体的な使用例を見てみましょう。まずは簡単な例から紹介してみます。1+1を計算させてみる場合にはtf.constantを使用すると以下のようになります。

In [1]: import tensorflow as tf

In [2]: x = tf.constant(1)

In [3]: y = tf.constant(1)

In [4]: z = x + y

In [5]: with tf.Session() as sess:
   ...:     print(sess.run(z))
   ...:
2

tf.constantは定数を指定することができます。では、x+1=zのように任意の値をxに与えるためには、tf.placeholderを使用する必要があります。

In [1]: import tensorflow as tf

In [2]: x = tf.placeholder(tf.int32)

In [3]: y = tf.constant(1)

In [4]: z = x + y

In [5]: with tf.Session() as sess:
   ...:     print(sess.run(z, feed_dict={x: 2}))
   ...:
3

x=2を実行時に定義して2+1=3を計算することができました。

次に、tf.placeholdershapeを指定して配列を渡せるようにしてみます。

In [1]: import tensorflow as tf

In [2]: a = tf.placeholder(tf.float32, shape=[2])

In [3]: b = tf.placeholder(tf.float32, shape=[2])

In [4]: c = a * b

In [5]: with tf.Session() as sess:
   ...:     print(sess.run(c, feed_dict={a: [2, 1], b: [1, 2]}))
   ...:
[ 2.  2.]

配列を渡して、結果を配列で受け取ることができるようになります。以下のように、feed_dictにNumPyのndarrayも渡すことができます。NumPyのndarrayについては以下の記事で解説しています。

NumPyの多次元配列データ構造ndarrayの基礎 /features/numpy/numpy-ndarray.html

In [6]: import numpy as np

In [7]: with tf.Session() as sess:
   ...:     print(sess.run(c, feed_dict={a: [2, -1], b: np.arange(2)})) # ndarrayを渡すこともできる
   ...:
[ 0. -1.]

tf.placeholder_with_default

tf.placeholderは初期値を持たないので、以下のようにfeed_dictに値を指定しないとInvalidArgumentErrorを発生させてしまいます。

In [1]: import tensorflow as tf

In [2]: a = tf.placeholder(tf.int32)

In [3]: b = tf.constant(1)

In [4]: with tf.Session() as sess:
   ...:     print(sess.run(a + b))
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder' with dtype int32

tf.placeholder_with_defaultを使うことで、事前に指定されない場合に使用する初期値を決めておくことができます。

In [1]: import tensorflow as tf

In [2]: a = tf.placeholder_with_default(1, shape=[])

In [3]: b = tf.constant(1)

In [4]: with tf.Session() as sess:
   ...:     print(sess.run(a + b))
   ...:
2

In [5]: with tf.Session() as sess:
   ...:     print(sess.run(a + b, feed_dict={a: -1}))
   ...:
0

まとめ

今回はtf.placeholderの基本的な使い方を解説しました。tf.placeholderを使えるようになると、実行時に任意の値を計算グラフに渡すことができるようになります。

機械学習のコードでは、主に入力層に渡す変数をtf.placeholderで定義して、実行時に学習に入力画像や情報をバッチ毎に供給するために使用することが多いです。

是非、使いこなせるようにしてみてください。