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階のテンソル)
{
\left(
  \begin{array}{cc}
    3 & 4 \\
    5 & 6 \\
  \end{array}
\right)
}

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]]

続きはこちらです。