本記事では、ついにtensorflowの変数について扱っていきます。過去の記事の内容だけでは定数のみしか扱えなかったので、所詮高度な電卓にしか使えませんでしたが、これでプログラムとして立派なものとして扱うことができます。では。見ていきましょう。
tensorflowの変数の種類
皆さんは私の記事である”tensorflowの基礎“で、私がセッションと式の関係を関数で例えていたのを覚えているでしょうか?関数で例えた割にはあの後で、関数で例えた部分はなかったわけですが、その例示がここで生きてきます。一般的なプログラムにおいて、変数というと何かを格納するものという扱いですが、実際のところその種類は2パターンあると思います。それぞれ
- プログラマが初期値を入力しているパターン
- ユーザに初期値を入力させるパターン
の二つです。つまり、そのコードを書いている時点でプログラマがその変数の中身を把握しているしていないかですね。わかりやすく例えるのならば、プログラマが初期値を入力しているパターンは、関数を記述するときのスコープ内変数(普通の変数のこと)。もう一つは関数への引数です。tensorflowではこの2種類が明確に分かれています。また、それぞれを「プレースホルダ」と「変数」と呼びます。先ほどの関数の例でいうと。
- 変数=スコープ内変数
- プレースホルダ=関数への引数
となります。では、実際にどのように記述するのかを見ていきましょう。
- 変数:tensorflow.Variable(初期値)
- プレースホルダ:tensorflow.placeholder(変数の型,shape)
変数の方は分かりやすいですね。定数と変わりません。プレースホルダの方は少し難しいですね。特に型はpythonのみをやっている人にとっては馴染みがないかもしれません。簡単にこれが何かを説明すると。プレースホルダ内に入る値が整数なのか、少数点数なのか、文字列なのかなどを決めるものです。要するに、プレースホルダには指定された形の値しか入らないのですね。pythonのように”変数名=値”とはできないことに注意しましょう。ちなみに、tensorflowの型で主に使用するのは
- 単精度浮動小数点数:tensorflow.float32
- 倍精度浮動小数点数:tensorflow.float64
- 複素数:tensorflow.complex64
- 整数:tensorflow.int32
- 符号なし整数:tensorflow.uint32
- 真理値:tensorflow.bool
- 文字列:tensorflow.string
だと思います。この他にも多くの型がありますが、詳しくはtensorflowの公式ページを見てください。では早速試してみましょう。
#インポート
import tensorflow as tf
#式の定義
# 定数の定義
a=tf.constant(1)
b=tf.constant(2)
# 変数の定義
var=tf.Variable(3)
# プレースホルダーの定義
ph=tf.placeholder(tf.int32,(1,))
#ph=tf.placeholder(tf.int32)でも可能=shapeは(1,)なら省略できる
# 式の定義 ( ((a+var)+ph) + (ph+b) = ((1+3)+ph) + (ph+2) = 6+ph+ph)
add1=tf.add(a,var) #定数+変数
var2=tf.Variable(add1) #式の計算結果を変数に代入
add2=tf.add(ph,b) #プレースホルダーと定数の計算
add3=tf.add(var2,ph) #変数とプレースホルダの計算
all_add=tf.add(add2,add3) #最終的な加算
#式の定義終了
#セッションの開始
with tf.Session() as s:
#変数の初期化 (重要!)
s.run(tf.global_variables_initializer())
#プレースホルダーの設定はfeed_dectで渡す。また、値はリストで渡すこと
print("Answer\t:",s.run(all_add,feed_dict={ph:[4]}))
<実行結果>
Answer : [6]
色々と新しいことが出てきて混乱しますね。重要なポイントを1つずつ見ていきましょう
1.変数の初期化
変数を含む式をセッションで実行する際には変数の初期化が必要です。初期化は
- tensorflow.Session().run(tensorflow.global_variables_initializer())
で行います。これを行わずにセッションを開始してしまった場合には、エラーを吐かれることになります。
2.プレースホルダーへの値渡し
プレースホルダーへ値を渡すには、
- tensorflow.Session().run(数式,feed_dict={プレースホルダ変数名:値},…)
とする必要があります。値は基本的にリストである必要があります。また、プレースホルダの変数名を指定していない場合(他のメソッドに直接書き込んだ場合など)には、プレースホルダー宣言時の引数に”name=変数名”と付け足してください。
今日の内容は以上!
まとめ
- 変数宣言:tensorflow.Variable(初期値)
- プレースホルダ宣言:tensorflow.plaseholder(変数の型,shape)
- 変数初期化:(略).run(tensorflow.global_variables_initializer())
- プレースホルダ代入:(略).run(数式,feed_dict={プレースホルダ変数名:値,…})
エクストラ
ここからは読まなくても問題ない部分です。以下のプログラムでは、定数に加算の結果を代入しようとしていますができるでしょうか?
#インポート
import tensorflow as tf
#式の定義
# 定数の定義
a=tf.constant(1)
b=tf.constant(2)
c=tf.constant(3)
# 式の定義
add1=tf.add(a,b)
d=tf.constant(add1) #できるかな?
add2=tf.add(c,d)
#式の定義終了
#セッションの開始
with tf.Session as s:
print("Answer\t:",s.run(add2))
結果は、ダメでした。以下のようなエラーを吐かれます。
<実行結果>
Exception has occurred: TypeError
List of Tensors when single Tensor expected