2018年5月17日 更新

Python × TensorFlow ③ ~TensorFlow を扱う上で必要な知識「プレースホルダ」~

8,808 view お気に入り 0
本記事では,TensorFlow を扱う上で必要な以下3つの知識のうち「プレースホルダ」について解説していきたいと思います.
・テンソル ← 済
・定数と変数 ← 済
・プレースホルダ
プレースホルダは,後でデータを割り当てるをために用意されたテンソルです.これにより,データを必要とせずに操作を作成し,計算グラフを作成することができます.

プレースホルダにデータを送るには 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 を掛けるという操作を行っています.
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 件

関連する記事 こんな記事も人気です♪

Python × TensorFlow ② ~TensorFlow を扱う上で必要な知識「定数・変数」~

Python × TensorFlow ② ~TensorFlow を扱う上で必要な知識「定数・変数」~

TensorFlow を扱う上で必要な以下3つの知識のうち「定数と変数」について解説していきたいと思います.
井上 大輝 | 9,080 view
KaggleチュートリアルTitanicで上位1%に入った話。(0.87081)

KaggleチュートリアルTitanicで上位1%に入った話。(0.87081)

前回書いた「KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)」 から久々にやり直した結果上位1%の0.87081を出せたのでどのようにしたのかを書いていきます。
Takumi Ihara | 52,031 view
KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)

KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)

まだ機械学習の勉強を初めて4ヶ月ですが、色々やってみた結果、約7000人のうち200位ぐらいの0.82297という記録を出せたので、色々振り返りながら書いていきます。
Takumi Ihara | 190,108 view

この記事のキーワード

この記事のキュレーター

井上 大輝 井上 大輝