ねころこの備忘録

僕の開発の手順とか実験結果とか感想とかをつらつら書き込んでいくお墓.僕の魂を成仏させるためのお墓です.お経(コメント)待ってます

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=...の処理は何なんだと思う方がいると思います.下の図を見てください.
f:id:ryuga13tk:20190119183658p:plain

見ましたね?
この図のようなグラフを定義することが,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)

現場で使える! TensorFlow開発入門 Kerasによる深層学習モデル構築手法 (AI & TECHNOLOGY)