読者です 読者をやめる 読者になる 読者になる

アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

書籍『Tensorflowで学ぶディープラーニング入門』まとめ(1章)#Tensorflowコードの基本的な使い方

機械学習

この記事は前の記事の続きで書いてます。前記事はこちら
trafalbad.hatenadiary.jp




Tensorflowの基本的な使い方



ここでは機械学習の基本「最適化アルゴリズム」の3ステップをTensorflowで実際に実装していきます。(ディープラーニングは「最適化アルゴリズム」の応用です)



「最適化アルゴリズム」の3ステップをTensorflowのコードで表現する

前記事で見た、ある土地の平均気温を求める問題をまた取り上げます。


「最適化アルゴリズム」の3ステップは次のようにものでした。
①与えられたデータを元にして、未知のデータを予測する数式を立てる
②2乗誤差関数(損失関数)を求める
③勾配降下法を使って2乗誤差関数を最小にする

そのうちの①では、与えられたデータから数式を立てます。
{y=w_{0}+w_{1}x+w_{2}x^{2}+w_{3}x^{3}+w_{4}x^{4}}
Tensorflowは多次元配列(行列)同士の計算になるのでベクトル表記になります。上の式を表すと

{\begin{equation}
\mbox{x} \times \mbox{w} =\mbox{y}
\end{equation}}
となります。ここでyが予測気温、xが何月かを表します。ここでwは「最適化のパラメーター」で、これが予測気温を求めるのに一番重要な値です。「最適化アルゴリズム」でこのwを求めれば、yの予測気温が求まります。

そしてトレーニングセットとして過去の平均気温データをtとして用意します。
{\begin{equation}
  t= \left(
    \begin{array}{rr}
      t_1 \\
      t_2\\
      \vdots \\
      t_{12}
    \end{array}
  \right)
\end{equation}}

このyとtを元に、最適化アルゴリズムのステップ②である2乗誤差関数(損失関数)を求めます。
{y=\displaystyle \sum_{ σ= 1 }^{ 12 }(y-t)^{2}}

ここまででステップ②まで終わりました。
後はステップ③の勾配降下法を行えばOK



機械学習の3ステップに必要なTensorflowコード
ここで今見てきた3ステップをTensorflowコードで表現します。

Tensorflowではトレーニングセットに当たるデータはplaceholderクラスでインスタンス化(placeholderクラスをxに代入)します。

x = tf.placeholder(tf.float32, [None, 5])

ここではコードの意味は追求せずに、3ステップをTensorflowで表現する流れだけを見ていきます。

そして最適化のパラメーターwはvariableクラスでインスタンス化。

w = tf.Variable(tf.zeros([5, 1]))

そしてy=xwは

y = tf.matmul(x, w)

matmulクラスは行列同士の演算をするクラス。
さらにトレーニングセットのtは

t = tf.placeholder(tf.float32, [None, 1])

これで2乗誤差関数を求め、lossに格納します。

loss = tf.reduce_sum(tf.square(y-t))

ここまででステップ②まで終わりました。

後はステップ③を次のコードで行います

train_step = tf.train.AdamOptimizer().minimize(loss)

これで機械学習の3ステップに必要なコードが揃いました。



セッションに具体的な値を代入してトレーニングを行う
今まで用意してきたのは「最適化アルゴリズム」の3ステップに必要なTensorflowのコードですが、これには具体的な数値が入ってません。
いわば中身がない空っぽの箱です。「最適化アルゴリズム」の3ステップを行うには、これに具体的な数値を代入する必要があります。

Tensorflowでは「最適化アルゴリズム」の3ステップを行う環境として「セッション」を用意する必要があります。セッションとは英語で「一定の期間」みたいな意味があり、このセッション内で「最適化アルゴリズム」を行います。

ある変数で「最適化アルゴリズム」を行ない、また別の新しい変数で「最適化アルゴリズム」を行う場合、さらに別のセッションを新しく作ります。こうして変数毎にセッションを用意して最適化アルゴリズムを行うのがTensorflowです。


f:id:trafalbad:20170320115636j:plain
セッション毎に変数を管理する。

そのセッションはコードでは次のように書きます。

sess = tf.Session()
sess.run(tf.initialize_all_variables())

2行目ではセッションのwの値、つまりvariableクラスを初期しています。




「最適化アルゴリズム」の3ステップをやってみる
ここで最適化アルゴリズムを実際にやってみます。あくまで雰囲気だけつかめればと思います。

まずステップ①②で用意した式に値を代入していきます。

train_t = np.array([5.2, 5.7, 8.6, 14.9, 18.2, 20.4,
                    25.5, 26.4, 22.8, 17.5, 11.1, 6.6])
train_t = train_t.reshape([12,1])

train_x = np.zeros([12, 5])
for row, month in enumerate(range(1, 13)):
    for col, n in enumerate(range(0, 5)):
        train_x[row][col] = month**n

そしてステップ③を行います。勾配降下法で最適化するわけです。これでwの値が求まり、予測気温が求まります。
ここではトレーニングアルゴリズムを1万回行い、その時点での2乗誤差関数の値を表示しています。(stepが回数、lossが二乗誤差関数の値)

i = 0
for _ in range(100000):
    i += 1
    sess.run(train_step, feed_dict={x:train_x, t:train_t})
    if i % 10000 == 0:
        loss_val = sess.run(loss, feed_dict={x:train_x, t:train_t})
        print ('Step: %d, Loss: %f' % (i, loss_val))

>>>
Step: 10000, Loss: 31.014391
Step: 20000, Loss: 29.295158
Step: 30000, Loss: 28.033054
Step: 40000, Loss: 26.855808
Step: 50000, Loss: 25.771938
Step: 60000, Loss: 26.711918
Step: 70000, Loss: 24.436256
Step: 80000, Loss: 22.975143
Step: 90000, Loss: 22.194229
Step: 100000, Loss: 21.434664#出力結果

さらにもう一万回トレーニングアルゴリズムを行います。

for _ in range(100000):
    i += 1
    sess.run(train_step, feed_dict={x:train_x, t:train_t})
    if i % 10000 == 0:
        loss_val = sess.run(loss, feed_dict={x:train_x, t:train_t})
        print ('Step: %d, Loss: %f' % (i, loss_val))

>>>
Step: 110000, Loss: 20.749628
Step: 120000, Loss: 20.167929
Step: 130000, Loss: 19.527676
Step: 140000, Loss: 18.983555
Step: 150000, Loss: 18.480526
Step: 160000, Loss: 18.012512
Step: 170000, Loss: 17.615368
Step: 180000, Loss: 17.179623
Step: 190000, Loss: 16.879869
Step: 200000, Loss: 20.717033#出力結果

ここら辺で打ち切りましょう。ここでwの値がどのようになっているか確認します。下の式のwの値ですね。

w_val = sess.run(w)
print w_val

>>>
[[ 6.10566282]
 [-4.04159737]
 [ 2.51030278]
 [-0.2817387 ]
 [ 0.00828196]]#wの値

そして予測気温yを求める計算式にwを代入します。

def predict(x):
    result = 0.0
    for n in range(0, 5):
        result += w_val[n][0] * x**n
    return result

では予想気温を図で表示してみます。

fig = plt.figure()
subplot = fig.add_subplot(1,1,1)
subplot.set_xlim(1,12)
subplot.scatter(range(1,13), train_t)
linex = np.linspace(1,12,100)
liney = predict(linex)
subplot.plot(linex, liney)

f:id:trafalbad:20170320115455p:plain


これで最適化アルゴリズムの3ステップをTensorflowで行い、気温を予測できました。

これでTensorflowの基本的な使い方をまとめたつもりです。これで2記事になりましたが、『Tensorflowで学ぶディープラーニング入門』の1章のまとめは終わり。

2〜5章のまとめ記事では、2〜5章を学んでできるようになったことを淡々とまとめていきます。

広告を非表示にする