本記事では,TensorFlow を扱う上で必要な以下3つの知識のうち「プレースホルダ」について解説していきたいと思います.
・テンソル ← 済
・定数と変数 ← 済
・プレースホルダ
・テンソル ← 済
・定数と変数 ← 済
・プレースホルダ
プレースホルダは,後でデータを割り当てるをために用意されたテンソルです.これにより,データを必要とせずに操作を作成し,計算グラフを作成することができます.
プレースホルダにデータを送るには feed_dict を使用します.Python の数値・文字列・リストや,Numpy の ndarrays を送ることが可能です.
プレースホルダにデータを送るには feed_dict を使用します.Python の数値・文字列・リストや,Numpy の ndarrays を送ることが可能です.
import tensorflow as tf import numpy as np a = tf.constant(3) b = tf.placeholder(dtype=tf.int32, shape=None) c = tf.add(a, b) with tf.Session() as sess: print(sess.run(c, feed_dict={b: 1})) print(sess.run(c, feed_dict={b: [1, 2, 3, 4]})) print(sess.run(c, feed_dict={b: np.random.randint(0, 9, 10)})) # 以下,実行結果 # 4 # [4 5 6 7] # [ 4 7 8 4 7 3 4 9 10 4]
example_1.py
一見,feed_dict でテンソルを送ることもできそうですが,下記コードを見るとできないことが分かるかと思います.これは,テンソル自体は計算グラフの一部であり,実際にはデータを有していないからです.
import tensorflow as tf a = tf.constant(3) b = tf.placeholder(dtype=tf.int32, shape=None) c = tf.add(a, b) with tf.Session() as sess: print(sess.run(c, feed_dict={b: tf.ones(shape=[2, 3])})) # 以下,実行結果 # TypeError: The value of a feed cannot be a tf.Tensor object. # Acceptable feed values include Python scalars, strings, lists, numpy ndarrays, or TensorHandles.
example_2.py
なので,sess.run() を行い,値を取得した後であれば feed_dict でプレースホルダにデータを送ることが可能です.
import tensorflow as tf a = tf.constant(3) b = tf.placeholder(dtype=tf.int32, shape=None) c = tf.add(a, b) with tf.Session() as sess: ones_tsr = sess.run(tf.ones(shape=[2, 3])) print(sess.run(c, feed_dict={b: ones_tsr})) print(type(tf.ones(shape=[2, 3]))) print(type(ones_tsr)) # 以下,実行結果 # [[4 4 4] # [4 4 4]] # <class 'tensorflow.python.framework.ops.Tensor'> # <class 'numpy.ndarray'>
example_3.py
話は変わりますが,データの型としては,下記コードが示すように,TensorFlow における「定数」と同じであります.
import tensorflow as tf a = tf.Variable(tf.constant(1)) b = tf.constant(1) c = tf.placeholder(dtype=tf.float32, shape=None) print(type(a)) print(type(b)) print(type(c)) # 以下,実行結果 # <class 'tensorflow.python.ops.variables.Variable'> # <class 'tensorflow.python.framework.ops.Tensor'> # <class 'tensorflow.python.framework.ops.Tensor'>
example_4.py
このプレースホルダは,ニューラルネットや CNN などの訓練データを送る際に用いられます.というのも,訓練データなどは,1つ1つのデータの形状は決まっていますが,それらが何セットあるのかは決めていないという状況が良くあります.そこで,データ数の部分を None とすることで,実際にデータがなくても計算グラフを作成することが可能となります.
下記コードでは,MNIST の画像を読み込み,プレースホルダに送るということを行っています.プレースホルダで shape を指定しており,None がデータ数,28 が画像の縦横ピクセル数 を表しています.そして,そのデータに対して,255.0 を掛けるという操作を行っています.
下記コードでは,MNIST の画像を読み込み,プレースホルダに送るということを行っています.プレースホルダで shape を指定しており,None がデータ数,28 が画像の縦横ピクセル数 を表しています.そして,そのデータに対して,255.0 を掛けるという操作を行っています.
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data import matplotlib.pyplot as plt a = tf.placeholder(dtype=tf.float32, shape=(None, 28, 28)) b = tf.constant(255.0) c = a * b with tf.Session() as sess: mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) img = mnist.train.images img = img.reshape(-1, 28, 28) result = sess.run(c, feed_dict={a: img}) for i in range(6): plt.subplot(2, 3, i+1) plt.imshow(result[i]) plt.show()
example_5.py
まとめ
ここまでで,「テンソル」,「定数と変数 」,「プレースホルダ」についての解説を行いました.これらを理解した上で,MNIST などの TensorFlow で書かれたコードを見ると,TensorFlow 内で何が行われるかが分かるようになるかと思います.
13 件