TensorFlowの基礎的な使い方
今日もTensorFlowのお話です.
TensorFlow入ってないよって人は,
過去の記事を見てください.
www.nekorokomemordm.info
それではいきましょう.
TensorFlowの基礎って?
TensorFlowとは,データフローグラフという概念を取り入れています.データフローグラフが分かっている方は,飛ばしてもらって構いません.
下のソースコードを見てください.
import tensorflow as tf a = tf.constant(1, name = 'a') b = tf.constant(1, name = 'b') c = a + b with tf.Session() as sess: print(sess.run(c))
一目見るだけでも,1+1の計算をしてそうだなぁ...と思う人が多いと思いますが,実際に1+1の計算をしているのは,どの部分だと思いますか?
聞き方で大体察しが付くとは思いますが,
sess.run(c)
が,実際に計算を行っている部分です.
じゃあ,c=a+bは何なのか,気になると思いますが,これがデータフローグラフであります.
データフローグラフとは,「構築」と「実行」が別々に行われた処理のことです.
先に構築をしておくことで,並列・分散処理が可能になっています.
では,a=...b=...c=...の処理は何なんだと思う方がいると思います.下の図を見てください.
見ましたね?
この図のようなグラフを定義することが,a=...b=...c=...の処理です.
そして,このグラフを定義した後一気にsess.run(c)で,additionを実行します.
このように,「構築」と「実行」を分けています.
TensorFlowでの処理
「TensorFlowの基礎って?」という部分では,tf.constantを使いました.これは定数になっていまして,これからは変数も混ぜたコードになっていきます.
サクサク行きます.説明もないので.
変数とその代入
import tensorflow as tf a = tf.Variable(1, name = 'a') #変数の宣言 b = tf.constant(1, name = 'b') #定数の宣言 c = tf.assign(a, a +b) #aにa+bの値を代入して,その値を返すと定義 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) #すべての変数の初期化 print("1回目:[c, a] = ", sess.run([c, a])) print("2回目:[c, a] = ", sess.run([c, a]))
上記コードを実行すると,
1回目:[c, a] = [2, 2]
2回目:[c, a] = [3, 3]
という結果が出るはずです.
これは,コメントでも説明しているままです.
ちなみに,a = a + bは無理なのか?という質問があるかなと思いますが,出来ますが,実行結果が2になり,その結果がaに代入されません.なので,更新するためにassignを使います.
また,tf.global_variables_initializer()は,すべての変数を初期化するための関数になっています.
変数の初期化にはほかにもtf.initialize_variablesがありますが,一括で初期化できる前者のほうが便利です.
プレースホルダー
プレースホルダーは,実行時に値を入れてあげることができる便利な箱です.
定数だと実行時に変更するのはできないし,変数もできません.なので,プレースホルダーを使います.
import tensorflow as tf a = tf.placeholder(tf.int32, name = 'a') b = tf.constant(1, name = 'b') c = a + b with tf.Session() as sess: print("a + b = ", sess.run(c, feed_dict = {a : 1}))
実行結果は,
a + b = 2
のようになるはずです.
以上が,スカラの計算です.
もちろん,機械学習のライブラリなので,名前の通り行列・・・いや,テンソル(多次元配列)の計算もできます.
ためしに・・・
import tensorflow as tf a = tf.constant([1, 6], name = 'a') b = tf.constant([2, 7], name = 'b') c = a + b with tf.Session() as sess: print(sess.run(c))
を実行してみればわかると思います.
結果は,[ 3 13]です.
これは,ベクトルの計算ですが.
行列の計算だと・・・
import tensorflow as tf a = tf.constant([[1, 6], [2, 3]], name = 'a') b = tf.constant([[2, 7], [4, 5]], name = 'b') c = a + b with tf.Session() as sess: print(sess.run(c))
結果:[[ 3 13]
[ 6 8]]
指定の仕方を変えれば,placeholderでも...ほら,簡単に.
import tensorflow as tf a = tf.placeholder((2, 2), tf.int32, name = 'a') b = tf.constant([[2, 7], [4, 5]], name = 'b') c = a + b with tf.Session() as sess: print(sess.run(c, feed_dict = {a : [[1, 6], [2, 3]]}))
結果:[[ 3 13]
[ 6 8]]
以上です.
次回は,実行した結果を別のセッションでも扱うためのSaverを扱います.
現場で使える! TensorFlow開発入門 Kerasによる深層学習モデル構築手法 (AI & TECHNOLOGY)
- 作者: 太田満久,須藤広大,黒澤匠雅,小田大輔
- 出版社/メーカー: 翔泳社
- 発売日: 2018/04/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る