TensorFlow まとめ
TensorFlowは、計算をあらかじめ記述し、それを後ほど明示的に実行するという流れをとります。「計算の記述」をOpノード、「明示的な実行」をセッションという概念で行います。
こちらの記事がよくまとまっています。
qiita.com
少し昔の記事なので、initialize_all_variablesはobsoletedなことに注意してください。(今はglobal_variables_initializerです)
以下、tfのライブラリの補足です。MNIST Basicに出てくる関数を取り扱います。
前提として、行列の概念を思い出す必要があります。
mathwords.net
をところどころで参考にしてください。
tf.constant
定数です。実際の定数を定義します。
xは1という数字です。 (数学的にはスカラーです)
import tensorflow as tf x = tf.constant(1) print(sess.run(x))
1
yは[3,4]という2次元配列です。(数学的にはベクトルです。つまり1階のテンソル)
y = tf.constant([3,4]) # 2次元の配列 print(sess.run(y))
[3 4]
zは[[3,4],[5,6]]]という2次元配列です(数学的には以下の行列です。つまり2階のテンソル)
z = tf.constant([[3,4],[5,6]]) # 2x2行列 print(sess.run(z))
[[3 4]
[5 6]]
tf.placeholder
セッションの外側からデータを入れるために使います。プログラミング的には、関数の入力パラメーターが、セッションに対するプレースホルダーとなります。constantは実体を指定していますが、placeholderと次に出てくるvariableは、構造を指定しているのがポイントです。
1次元(=スカラー)
import tensorflow as tf sess = tf.Session() x = tf.placeholder("float") # 特に指定しない場合は、1次元の数字、つまりスカラー double = tf.add(x,x) r = sess.run(double, feed_dict={x:2}) print(r)
4.0
2次元(=ベクトル、1階のテンソル)
x = tf.placeholder(tf.int32,[2]) # 2次元を指定 double = tf.add(x,x) r = sess.run(double, feed_dict={x:[1,2]}) # 実体を入力 print(r)
[2 4]
2x2行列(=は、nxm行列、つまり2階のテンソル)
x = tf.placeholder("float",[2,2]) # 2x2行列を指定 double = tf.add(x,x) r = sess.run(double, feed_dict={x:[[1,2],[3,4]]}) # 実体を入力 print(r)
[[2. 4.]
[6. 8.]]
tf.Variable
セッションの中で変数として扱われます。
import tensorflow as tf x = tf.Variable([2,3], name="counter") # 2x3行列 c = tf.constant([[1,2],[3,4],[5,6]]) x = c init_op = tf.global_variables_initializer() sess = tf.Session() sess.run(init_op) r = sess.run(x) print(r)
[[1 2]
[3 4]
[5 6]]
tf.matmul
数学の「内積」です。
x = tf.placeholder("float", [1, 2]) # 1x2行列 y = tf.placeholder("float", [2, 1]) # 2x1行列 z = tf.matmul(x,y) init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) sess.run(z,feed_dict={x: [[3, 4]], y: [[5],[6]]}) # 内積だから 3x5+4x6 = 15+24 = 39
array([[39.]], dtype=float32)
tf.nn
Nerual Network系のライブラリです。
tf.nn.softmax
Softmax(シグモイド)関数です。確率分布、つまり総和が1になっています。
z = tf.placeholder("float", [1, 3]) # 1x3行列 s = tf.nn.softmax(z) init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) pd1 = sess.run(s,feed_dict={z: [[1,2,3]]}) print("[1,2,3] -> " , pd1) # 和が1 pd2 = sess.run(s,feed_dict={z: [[1,2,2]]}) print("[1,2,2] -> " , pd2) # 和が1
[1,2,3] -> [[0.09003057 0.24472848 0.66524094]] [1,2,2] -> [[0.15536241 0.42231882 0.42231882]]
MNISTの tf.nn.softmax(tf.matmul(x, W) + b) の理解のためにこちらを記載します。
# 2次元ベクトルへのSoftmax回帰 x = tf.placeholder("float", [1, 2]) # 1x2行列 y = tf.placeholder("float", [2, 2]) # 2x2行列 z = tf.matmul(x,y) s = tf.nn.softmax(z) init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) pz = sess.run(z,feed_dict={x: [[3, 4]], y: [[5,6],[7,8]]}) ps = sess.run(s,feed_dict={x: [[3, 4]], y: [[5,6],[7,8]]}) print("pz -> " , pz) print("ps -> " , ps)
pz -> [[43. 50.]] ps -> [[9.1105123e-04 9.9908900e-01]]