Contenu connexe
Similaire à TensorFlow を使った機械学習ことはじめ (GDG京都 機械学習勉強会) (20)
TensorFlow を使った機械学習ことはじめ (GDG京都 機械学習勉強会)
- 4. TensorFlow とは
Google社のMachine Intelligence
研究所が開発した数値計算ライブラリ
Deep Learning をはじめとする 機械学習 の
研究や活用にGoogle社内で用いられている
2011年から使用していたDistBeliefを強化
複数のCPU/GPUや、複数のマシンに分散して
実行できる。(※複数マシン対応版は未公開)
C++とPython 2or3 APIを持っている
2015年11月にオープンソース(Apache2.0)公開
2016-02-27 GDG京都 機械学習勉強会
4
- 5. データフローグラフ
2016-02-27 GDG京都 機械学習勉強会
5
掛け算
足し算
関数
テンソル が データフローグラフ 上を
流れるように計算処理している
テンソル
(多次元配列)
𝐶 = … (𝑅𝑒𝐿𝑈 𝑏 + 𝑊𝑋 )
数式で表現すると、
TensorFlow
巨大なデータにも使える
行列計算ライブラリ
ビッグデータの
機械学習に使える!出典)TensorFlow: Large-Scale Machine Learning
on Heterogeneous Distributed Systems, Google, 2015
- 7. 詳細は Web へ
2016-02-27 GDG京都 機械学習勉強会
7
https://speakerdeck.com/kazunori279/cloud-vision-api-and-tensorflow
例えば、佐藤さん@Google の資料など
- 17. すべての組合せを計算
2016-02-27 GDG京都 機械学習勉強会
17
ミカン
0 10 20 30 40 50 60 70 80 90 100
リンゴ
0 193533 158700 127800 100833 77800 58700 43533 32300 25000 21633 22200
10 164833 132733 104567 80333 60033 43667 31233 22733 18167 17533 20833
20 138467 109100 83667 62167 44600 30967 21267 15500 13667 15767 21800
30 114433 87800 65100 46333 31500 20600 13633 10600 11500 16333 25100
40 92733 68833 48867 32833 20733 12567 8333 8033 11667 19233 30733
50 73367 52200 34967 21667 12300 6867 5367 7800 14167 24467 38700
60 56333 37900 23400 12833 6200 3500 4733 9900 19000 32033 49000
70 41633 25933 14167 6333 2433 2467 6433 14333 26167 41933 61633
80 29267 16300 7267 2167 1000 3767 10467 21100 35667 54167 76600
90 19233 9000 2700 333 1900 7400 16833 30200 47500 68733 93900
100 11533 4033 467 833 5133 13367 25533 41633 61667 85633 113533
110 6167 1400 567 3667 10700 21667 36567 55400 78167 104867 135500
120 3133 1100 3000 8833 18600 32300 49933 71500 97000 126433 159800
130 2433 3133 7767 16333 28833 45267 65633 89933 118167 150333 186433
140 4067 7500 14867 26167 41400 60567 83667 110700 141667 176567 215400
150 8033 14200 24300 38333 56300 78200 104033 133800 167500 205133 246700
近そうな値は見つかるけど、計算は大変!
(もし単価が0円~1万円で、10種類買ったら?)
- 18. よく見ると、徐々に変化している
2016-02-27 GDG京都 機械学習勉強会
18
ミカン
0 10 20 30 40 50 60 70 80 90 100
リンゴ
0 193533 158700 127800 100833 77800 58700 43533 32300 25000 21633 22200
10 164833 132733 104567 80333 60033 43667 31233 22733 18167 17533 20833
20 138467 109100 83667 62167 44600 30967 21267 15500 13667 15767 21800
30 114433 87800 65100 46333 31500 20600 13633 10600 11500 16333 25100
40 92733 68833 48867 32833 20733 12567 8333 8033 11667 19233 30733
50 73367 52200 34967 21667 12300 6867 5367 7800 14167 24467 38700
60 56333 37900 23400 12833 6200 3500 4733 9900 19000 32033 49000
70 41633 25933 14167 6333 2433 2467 6433 14333 26167 41933 61633
80 29267 16300 7267 2167 1000 3767 10467 21100 35667 54167 76600
90 19233 9000 2700 333 1900 7400 16833 30200 47500 68733 93900
100 11533 4033 467 833 5133 13367 25533 41633 61667 85633 113533
110 6167 1400 567 3667 10700 21667 36567 55400 78167 104867 135500
120 3133 1100 3000 8833 18600 32300 49933 71500 97000 126433 159800
130 2433 3133 7767 16333 28833 45267 65633 89933 118167 150333 186433
140 4067 7500 14867 26167 41400 60567 83667 110700 141667 176567 215400
150 8033 14200 24300 38333 56300 78200 104033 133800 167500 205133 246700
ミカン 0
ミカン 40
ミカン 800
50000
100000
150000
200000
250000
0 20 40 60 80
100120
140
リンゴ
最小値
- 19. 小さくなる方向へたどっていくと...
2016-02-27 GDG京都 機械学習勉強会
19
ミカン
0 10 20 30 40 50 60 70 80 90 100
リンゴ
0 193533
10 132733
20 83667
30 46333
40 20733
50 6867
60 3500
70 2467
80 7267 2167 1000
90 2700 333 1900
100 467 833 5133
110
120
130
140
150
ミカン 0
ミカン 40
ミカン 800
50000
100000
150000
200000
250000
0 20 40 60 80
100120
140
リンゴ
最小値
少ない計算で早く最小値に!
※最小(大)値を求める処理="最適化"
- 23. TensorFlow の処理の流れ
2016-02-27 GDG京都 機械学習勉強会
23
# coding: utf-8
# 必要なモジュールを読み込む
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
# 1. 予測式(モデル)を記述する
# 入力変数と出力変数のプレースホルダを生成
x = tf.placeholder(tf.float32, shape=(None, 2), name="x")
y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y")
# モデルパラメータ
a = tf.Variable(tf.zeros((2, 1)), name="a")
# モデル式
y = tf.matmul(x, a)
# 2. 学習に必要な関数を定義する
# 誤差関数(loss)
loss = tf.reduce_mean(tf.square(y_ - y))
# 最適化手段を選ぶ(最急降下法)
train_step = tf.train.GradientDescentOptimizer(0.02).minimize(loss)
# 3. 実際に学習処理を実行する
# (1) 訓練データを生成する
train_x = np.array([[1., 3.], [3., 1.], [5., 7.]])
train_y = np.array([190., 330., 660.]).reshape(3, 1)
print "x=", train_x
print "y=", train_y
# (2) セッションを準備し,変数を初期化
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
# (3) 最急勾配法でパラメータ更新 (100回更新する)
for i in range(100):
_, l, a_ = sess.run([train_step, loss, a], feed_dict={x: train_x, y_: train_y})
if (i + 1) % 10 == 0:
print "step=%3d, a1=%6.2f, a2=%6.2f, loss=%.2f" % (i + 1, a_[0], a_[1], l)
# (4) 学習結果を出力
est_a = sess.run(a, feed_dict={x: train_x, y_: train_y})
print "Estimated: a1=%6.2f, a2=%6.2f" % (est_a[0], est_a[1])
# 4. 新しいデータに対して予測する
# (1) 新しいデータを用意
new_x = np.array([2., 4.]).reshape(1, 2)
# (2) 学習結果をつかって,予測実施
new_y = sess.run(y, feed_dict={x: new_x})
print new_y
# 5. 後片付け
# セッションを閉じる
sess.close()
0. ライブラリをロード
1. 予測式(モデル)を記述
2. 誤差関数と最適化手法を記述
3. 訓練データを作成(or読込)し
学習実行
4. 予測
5. 後片付け
- 24. 0. ライブラリをロード
2016-02-27 GDG京都 機械学習勉強会
24
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
TensorFlow のほか
高速な配列演算パッケージであるNumPyや
プロットしたい場合はmatplotlib.pyplotなど
使用するライブラリをロードする
- 25. 1. 予測式(モデル)を記述
2016-02-27 GDG京都 機械学習勉強会
25
# 入力変数と出力変数のプレースホルダを生成
x = tf.placeholder(tf.float32, shape=(None, 2), name="x")
y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y")
# モデルパラメータ
a = tf.Variable(tf.zeros((2, 1)), name="a")
# モデル式
y = tf.matmul(x, a)
入出力変数 placeholder, パラメータ Variable
・値を入れる"箱"を作成
(注意)shape = (訓練データの数, 次元数)
※"訓練データの数"は None にすると可変長扱い
・予測式(モデル)を記述
y x a
190
330
660
1 3
3 1
5 7
- 26. 2.誤差関数と最適化手法を記述
2016-02-27 GDG京都 機械学習勉強会
26
# 誤差関数(loss)
loss = tf.reduce_mean(tf.square(y_ - y))
# 最適化手段を選ぶ(最急降下法)
train_step = tf.train.GradientDescentOptimizer(0.02).minimize(loss)
・誤差関数を記述
ふつうの回帰問題 平均二乗誤差
1
𝑁
𝑦𝑖 − 𝑦𝑖
2
𝑁
𝑖
・最適化手法を選ぶ
・入門 最急降下法(勾配降下法) GradientDescent~
※どれを選ぶかで学習(最適化)の速さが変わる
・引数に適度な"学習率"を指定する
※大きすぎると学習失敗(発散), 小さすぎると学習が遅い
- 27. 3. 訓練データを作成(or読込)し,
2016-02-27 GDG京都 機械学習勉強会
27
train_x = np.array([[1., 3.], [3., 1.], [5., 7.]])
train_y = np.array([190., 330., 660.]).reshape(3, 1)
print "x=", train_x
print "y=", train_y
※予測式で定義した形状(shape)に合わせること
※実用場面では,外部データを(ファイルやSQLなどから)
読みとって2次元配列に整形する。
190
330
660
1 3
3 1
5 7
train_x train_y
- 28. 学習実行
2016-02-27 GDG京都 機械学習勉強会
28
# (2) セッションを準備し,変数を初期化
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
# (3) 最急勾配法でパラメータ更新 (100回更新する)
for i in range(100):
_, l, a_ = sess.run([train_step, loss, a], feed_dict={x: train_x, y_: train_y})
if (i + 1) % 10 == 0:
print "step=%3d, a1=%6.2f, a2=%6.2f, loss=%.2f" % (i + 1, a_[0], a_[1], l)
# (4) 学習結果を出力
est_a = sess.run(a, feed_dict={x: train_x, y_: train_y})
print "Estimated: a1=%6.2f, a2=%6.2f" % (est_a[0], est_a[1])
おまじない(初期化)
sess.run ( [出力, ...], feed_dict={入力リスト} )
sess.run を呼び出すことで、"出力"に指定した
データフローグラフが計算される
※ 学習を回すには、先ほど作成した最適化手段(train_step)を
出力値に指定して sess.run を呼び出す。
- 29. 参考: 実行結果
2016-02-27 GDG京都 機械学習勉強会
29
うまく学習できると...
step= 10, a1= 70.35, a2= 46.23, loss=2189.06
step= 20, a1= 83.06, a2= 36.70, loss=771.90
step= 30, a1= 90.13, a2= 31.41, loss=334.34
step= 40, a1= 94.05, a2= 28.47, loss=199.24
step= 50, a1= 96.23, a2= 26.84, loss=157.52
step= 60, a1= 97.44, a2= 25.93, loss=144.64
step= 70, a1= 98.12, a2= 25.42, loss=140.67
step= 80, a1= 98.49, a2= 25.14, loss=139.44
step= 90, a1= 98.70, a2= 24.99, loss=139.06
step=100, a1= 98.81, a2= 24.90, loss=138.94
Estimated: a1= 98.81, a2= 24.90
順
調
に
低
下
推定されたパラメータの値
- 30. 参考: 実行結果
2016-02-27 GDG京都 機械学習勉強会
30
学習率が大きすぎて学習失敗していると...
step= 10, (中略), loss=72692296.00
step= 20, (中略), loss=54651076608.00
step= 30, (中略), loss=41087909494784.00
: :
順
調
に
増
加
学習率を小さくしてみる
- 31. 4. 予測
2016-02-27 GDG京都 機械学習勉強会
31
# (1) 新しいデータを用意
new_x = np.array([2., 4.]).reshape(1, 2)
# (2) 学習結果をつかって,予測実施
new_y = sess.run(y, feed_dict={x: new_x})
print new_y
予測でも sess.run を用いる
feed_dictには新しい入力値を指定することに留意。(当然ですが...)
(参考)実行結果
[[ 297.22738647]]
円円 × 2 + 円 × 4 ≒99 25 297
- 33. TensorFlow の処理の流れ (再掲)
2016-02-27 GDG京都 機械学習勉強会
33
# coding: utf-8
# 必要なモジュールを読み込む
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
# 1. 予測式(モデル)を記述する
# 入力変数と出力変数のプレースホルダを生成
x = tf.placeholder(tf.float32, shape=(None, 2), name="x")
y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y")
# モデルパラメータ
a = tf.Variable(tf.zeros((2, 1)), name="a")
# モデル式
y = tf.matmul(x, a)
# 2. 学習に必要な関数を定義する
# 誤差関数(loss)
loss = tf.reduce_mean(tf.square(y_ - y))
# 最適化手段を選ぶ(最急降下法)
train_step = tf.train.GradientDescentOptimizer(0.02).minimize(loss)
# 3. 実際に学習処理を実行する
# (1) 訓練データを生成する
train_x = np.array([[1., 3.], [3., 1.], [5., 7.]])
train_y = np.array([190., 330., 660.]).reshape(3, 1)
print "x=", train_x
print "y=", train_y
# (2) セッションを準備し,変数を初期化
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
# (3) 最急勾配法でパラメータ更新 (100回更新する)
for i in range(100):
_, l, a_ = sess.run([train_step, loss, a], feed_dict={x: train_x, y_: train_y})
if (i + 1) % 10 == 0:
print "step=%3d, a1=%6.2f, a2=%6.2f, loss=%.2f" % (i + 1, a_[0], a_[1], l)
# (4) 学習結果を出力
est_a = sess.run(a, feed_dict={x: train_x, y_: train_y})
print "Estimated: a1=%6.2f, a2=%6.2f" % (est_a[0], est_a[1])
# 4. 新しいデータに対して予測する
# (1) 新しいデータを用意
new_x = np.array([2., 4.]).reshape(1, 2)
# (2) 学習結果をつかって,予測実施
new_y = sess.run(y, feed_dict={x: new_x})
print new_y
# 5. 後片付け
# セッションを閉じる
sess.close()
0. ライブラリをロード
1. 予測式(モデル)を記述
2. 誤差関数と最適化手法を記述
3. 訓練データを作成(or読込)し
学習実行
4. 予測
5. 後片付け
- 34. (補足) 線形回帰の応用場面
家賃
家賃 = a * 駅からの距離 + b * 築年数 + c * 広さ
明日の客数
客数 = a * 気温 + b * 昨年同日の客数
などなど
2016-02-27 GDG京都 機械学習勉強会
34
- 42. TensorFlow での実装
2016-02-27 GDG京都 機械学習勉強会
42
# coding: utf-8
# ### 必要なモジュールを読み込む
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
# ## TensorFlow でロジスティック回帰する
# 1. 学習したいモデルを記述する
# 入力変数と出力変数のプレースホルダを生成
x = tf.placeholder(tf.float32, shape=(None, 2), name="x")
y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y")
# モデルパラメータ
a = tf.Variable(-10 * tf.ones((2, 1)), name="a")
b = tf.Variable(200., name="b")
# モデル式
u = tf.matmul(x, a) + b
y = tf.sigmoid(u)
# 2. 学習やテストに必要な関数を定義する
# 誤差関数(loss)
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(u, y_))
# 最適化手段(最急降下法)
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 3. 実際に学習処理を実行する
# (1) 訓練データを生成する
train_x = np.array([[2., 3.], [0., 16.], [3., 1.], [2., 8.]])
train_y = np.array([1., 1., 0., 0.]).reshape(4, 1)
print "x=", train_x
print "y=", train_y
# (2) セッションを準備し,変数を初期化
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
# (3) 最急勾配法でパラメータ更新 (1000回更新する)
for i in range(1000):
_, l, a_, b_ = sess.run([train_step, loss, a, b], feed_dict={x: train_x, y_: train_y})
if (i + 1) % 100 == 0:
print "step=%3d, a1=%6.2f, a2=%6.2f, b=%6.2f, loss=%.2f" % (i + 1, a_[0], a_[1], b_, l)
# (4) 学習結果を出力
est_a, est_b = sess.run([a, b], feed_dict={x: train_x, y_: train_y})
print "Estimated: a1=%6.2f, a2=%6.2f, b=%6.2f" % (est_a[0], est_a[1], est_b)
# 4. 新しいデータに対して予測する
# (1) 新しいデータを用意
new_x = np.array([1., 11.]).reshape(1, 2)
# (2) 学習結果をつかって,予測実施
new_y = sess.run(y, feed_dict={x: new_x})
print new_y
# 5. 後片付け
# セッションを閉じる
sess.close()
0. ライブラリをロード
1. 予測式(モデル)を記述
2. 誤差関数と最適化手法を記述
3. 訓練データを作成(or読込)し
学習実行
4. 予測
5. 後片付け
※線形回帰の実装と,ほとんど同一
- 43. 1. 予測式(モデル)を記述
2016-02-27 GDG京都 機械学習勉強会
43
# 1. 学習したいモデルを記述する
# 入力変数と出力変数のプレースホルダを生成
x = tf.placeholder(tf.float32, shape=(None, 2), name="x")
y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y")
# モデルパラメータ
a = tf.Variable(-10 * tf.ones((2, 1)), name="a")
b = tf.Variable(200., name="b")
# モデル式
u = tf.matmul(x, a) + b
y = tf.sigmoid(u)
𝑦 = 𝜎(𝑏 + 𝑎1 𝑥1 + 𝑎2 𝑥2)
ロジット: u
今回の予測式に合わせて
モデルとパラメータを修正
追加
- 44. 2. 誤差関数と最適化手法を記述
2016-02-27 GDG京都 機械学習勉強会
44
# 誤差関数(loss)
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(u, y_))
# 最適化手段(最急降下法)
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
・誤差関数を変更
識別(分類)問題 クロスエントロピー
−𝑦𝑖 log 𝑦𝑖 − 1 − 𝑦𝑖 log(1 − 𝑦𝑖)
𝑁
𝑖
正解
予測値: 𝑦𝑖
正解
予測値: 𝑦𝑖
- 45. 3. 学習実行
2016-02-27 GDG京都 機械学習勉強会
45
# (2) セッションを準備し,変数を初期化
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
# (3) 最急勾配法でパラメータ更新 (1000回更新する)
for i in range(1000):
_, l, a_, b_ = sess.run([train_step, loss, a, b], feed_dict={x: train_x, y_: train_y})
if (i + 1) % 100 == 0:
print "step=%3d, a1=%6.2f, a2=%6.2f, b=%6.2f, loss=%.2f" % (i + 1, a_[0], a_[1], b_, l)
# (4) 学習結果を出力
est_a, est_b = sess.run([a, b], feed_dict={x: train_x, y_: train_y})
print "Estimated: a1=%6.2f, a2=%6.2f, b=%6.2f" % (est_a[0], est_a[1], est_b)
線形回帰とほぼ同じ!
【変更箇所】
・パラメータ b の出力を追加
・更新回数を 100回 1000回 に
※更新回数は,対象問題やデータ,初期値,モデルなどでまちまちです。
- 46. 学習結果
2016-02-27 GDG京都 機械学習勉強会
46
step=100, a1=-22.50, a2=-12.28, b=196.26, loss=42.75
step=200, a1=-35.00, a2=-12.06, b=192.68, loss=25.84
step=300, a1=-47.36, a2=-11.78, b=189.14, loss=9.24
step=400, a1=-55.13, a2=-11.51, b=186.75, loss=2.54
step=500, a1=-58.92, a2=-11.29, b=185.58, loss=0.02
step=600, a1=-59.26, a2=-11.23, b=185.47, loss=0.01
step=700, a1=-59.43, a2=-11.19, b=185.43, loss=0.00
step=800, a1=-59.53, a2=-11.17, b=185.39, loss=0.00
step=900, a1=-59.62, a2=-11.15, b=185.37, loss=0.00
step=1000, a1=-59.68, a2=-11.14, b=185.35, loss=0.00
Estimated: a1=-59.68, a2=-11.14, b=185.35
順
調
に
低
下
推定されたパラメータの値
- 50. one-hot ベクトル (one-of-K表現)
2016-02-27 GDG京都 機械学習勉強会
50
7
3
4
6
出力ラベル(1次元) 出力ラベル(10次元)
0 0 0 0 0 0 0 1 0 0
0 1 2 3 4 5 6 7 8 9
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
1つの多クラス識別問題が
10個の2クラス識別問題へ分解
- 54. TensorFlow での実装
2016-02-27 GDG京都 機械学習勉強会
54
# 0. 必要なモジュールを読み込む
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# MNISTデータの取得
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# 1. 学習したいモデルを記述する
# 入力変数と出力変数のプレースホルダを生成
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])
# モデルパラメータ(入力層:784ノード, 隠れ層:100ノード, 出力層:10ノード)
W1 = tf.Variable(tf.truncated_normal([784, 100]))
b1 = tf.Variable(tf.zeros([100]))
W2 = tf.Variable(tf.truncated_normal([100, 10]))
b2 = tf.Variable(tf.zeros([10]))
# モデル式
h = tf.sigmoid(tf.matmul(x, W1) + b1) # 入力層->隠れ層
u = tf.matmul(h, W2) + b2 # 隠れ層->出力層 (ロジット)
y = tf.nn.softmax(u) # 隠れ層->出力層 (ソフトマックス後)
# 2. 学習やテストに必要な関数を定義する
# 誤差関数(loss)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(u, y_))
# 最適化手段(最急降下法)
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
# 正答率(学習には用いない)
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# 3. 実際に学習処理を実行する
# (1) セッションを準備し,変数を初期化
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
# (2) バッチ型確率的勾配降下法でパラメータ更新
for i in range(10000):
# 訓練データから100サンプルをランダムに取得
batch_xs, batch_ys = mnist.train.next_batch(100)
# 学習
_, l = sess.run([train_step, loss], feed_dict={x: batch_xs, y_: batch_ys})
if (i + 1) % 1000 == 0:
print "step=%3d, loss=%.2f" % (i + 1, l)
# 4. テスト用データに対して予測し,性能を確認
# (1) テスト用データを1000サンプル取得
new_x = mnist.test.images[0:1000]
new_y_ = mnist.test.labels[0:1000]
# (2) 予測と性能評価
accuracy, new_y = sess.run([acc, y], feed_dict={x:new_x , y_:new_y_ })
print "Accuracy (for test data): %6.2f%%" % accuracy
print "True Label:", np.argmax(new_y_[0:15,], 1)
print "Est Label:", np.argmax(new_y[0:15, ], 1)
# 5. 後片付け
# セッションを閉じる
sess.close()
0. ライブラリをロード
1. 予測式(モデル)を記述
2. 誤差関数と最適化手法を記述
3. 訓練データを作成(or読込)し
学習実行
4. 予測
5. 後片付け
- 55. 1. 予測式(モデル)を記述
2016-02-27 GDG京都 機械学習勉強会
55
# 入力変数と出力変数のプレースホルダを生成
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])
# モデルパラメータ(入力層:784ノード, 隠れ層:100ノード, 出力層:10ノード)
W1 = tf.Variable(tf.truncated_normal([784, 100]))
b1 = tf.Variable(tf.zeros([100]))
W2 = tf.Variable(tf.truncated_normal([100, 10]))
b2 = tf.Variable(tf.zeros([10]))
# モデル式
h = tf.sigmoid(tf.matmul(x, W1) + b1) # 入力層->隠れ層
u = tf.matmul(h, W2) + b2 # 隠れ層->出力層 (ロジット)
y = tf.nn.softmax(u) # 隠れ層->出力層 (ソフトマックス後)
x
𝑥𝑊1 + 𝑏1
h
𝑠𝑖𝑔𝑚𝑜𝑖𝑑()
隠れ層
u y
ℎ𝑊2 + 𝑏2 𝑠𝑜𝑓𝑡𝑚𝑎𝑥()
出力層入力層
784
10
予測式(モデル, ネットワーク)を実装
- 56. 2. 誤差関数と最適化手法を記述
2016-02-27 GDG京都 機械学習勉強会
56
# 誤差関数(loss)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(u, y_))
# 最適化手段(最急降下法)
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
# 正答率(学習には用いない)
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
・誤差関数を変更
多クラス識別(分類)問題
多クラス用クロスエントロピー
(softmax_cross_entropy_with_logits)
- 57. 3. 学習実行
2016-02-27 GDG京都 機械学習勉強会
57
# MNISTデータの取得
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# (2) バッチ型確率的勾配降下法でパラメータ更新
for i in range(10000):
# 訓練データから100サンプルをランダムに取得
batch_xs, batch_ys = mnist.train.next_batch(100)
# 学習
_, l = sess.run([train_step, loss], feed_dict={x: batch_xs, y_: batch_ys})
if (i + 1) % 1000 == 0:
print "step=%3d, loss=%.2f" % (i + 1, l)
大規模なデータで学習する時の工夫
・各ステップで,100個の訓練データを
ランダムに取り出して学習 (確率的勾配降下法)
速く学習が進む
- 58. 参考: 学習結果
2016-02-27 GDG京都 機械学習勉強会
58
step=1000, loss=2.09
step=2000, loss=1.45
step=3000, loss=1.38
step=4000, loss=0.77
step=5000, loss=0.63
step=6000, loss=0.52
step=7000, loss=0.78
step=8000, loss=0.73
step=9000, loss=0.55
step=10000, loss=0.58
ゆ
ら
ぎ
な
が
ら
低
下
- 59. 4. 予測
2016-02-27 GDG京都 機械学習勉強会
59
# (1) テスト用データを1000サンプル取得
new_x = mnist.test.images[0:1000]
new_y_ = mnist.test.labels[0:1000]
# (2) 予測と性能評価
accuracy, new_y = sess.run([acc, y], feed_dict={x:new_x , y_:new_y_ })
print "Accuracy (for test data): %6.2f%%" % accuracy * 100
print "True Label:", np.argmax(new_y_[0:15,], 1)
print "Est Label:", np.argmax(new_y[0:15, ], 1)
ここはこれまでと同様
【実行結果例】
Accuracy(test data): 80.0%
True Label: [7 2 1 0 4 1 4 9 5 9 0 6 9 0 1]
Est Label: [7 2 1 0 9 1 4 9 2 9 0 6 9 0 1]