Pythonで機械学習 手書き数字認識 学習処理 Part(15)

colaboratory

はじめに

こんにちは、swim-loverです。 Pythonで機械学習の一つである手書き数字認識を実装しています。Pythonを始めたばかりですが、「使いながら覚える」をコンセプトに勉強しています。 第14回は、勾配(gradient)のプロットについても使ってみました。今回も、参考図書にしたがって進めます。

参考図書

機械学習の参考書籍として、”斎藤康毅著 ゼロから作るDeep Learning オライリージャパン 2016年9月”を使用しました。

勾配法 gradient method

機械学習のパラメータは、重みとバイアスですが、これらの最適な値とは、損失関数が最小になるときです。Part(14)の最後で触れましたが、関数の値を最も減らす方向を示すのが勾配でした。

勾配法は、勾配方向に関数の値を少しずつ変化せて、関数の値を小さくする方法になります。

勾配法を数式で確認します。関数は、f(x0,x1)で2変数であるときに、以下のようになります。

ギリシャ文字η(イータ)は学習率と呼ばれます。この式は1回の更新の式なので、この学習では、ステップを何度も繰り返します。η=0.01や0.001から始めるとして、一通りの学習が終わったら、η=0.02や0.002などに更新して、また同じ学習を行い、結果を確認します。

勾配降下法 gradient descent method Python実装

7-12行目が、勾配降下法の実装です。以前実装した勾配関数 numerical_grad()をstep_num回数分繰り返しています。

35行目がメイン処理になります。学習率lr=0.1を指定しています。

import numpy as np

#f(x)=x0^2+x1^2
def func_2(x):
  return x[0]**2+x[1]**2

def grad_descent(f,init_x,lr=0.01,step_num=100):
  x=init_x
  for i in range(step_num):
    grad =numerical_grad(f,x)
    x -=lr*grad
  return x

def numerical_grad(f,x):
  #h = 10e-50  # bad example, too small value
  h = 1e-4    # good example
  grad=np.zeros_like(x)  #make zero data
  for idx in range(x.size):
    tmp = x[idx]
    #calc f(x+h)
    x[idx]=tmp + h #add h only x[idx]
    fxh1 = f(x)

    #calc f(x-h)
    x[idx]=tmp - h #subs h only x[idx]
    fxh2 = f(x)

    #calc grad about ixd
    grad[idx]=(fxh1-fxh2)/(2*h)
    x[idx]=tmp  #restore tmp

  return grad

init_x = np.array([-3.0,4.0])
ans = grad_descent(func_2,init_x,lr=0.1,step_num=100)
print(ans)

python モジュール化

これまでColab環境でいくつかの関数を作ってきましたが、後々、関数の使いまわしができるようモジュール化しておきます。

common_func.ipynb というファイル名で次のような関数をまとめてみます。

#soft max
def softmax(x):
  c=np.max(x)
  exp_a=np.exp(x-c)
  sum_exp_a=np.sum(exp_a)
  y=exp_a/sum_exp_a
  return y

#sigmoid 
def sigmoid(x):
  return 1/(1+np.exp(-x))

#meas squre err  
def mean_squre_err(y,t):
  return 0.5* np.sum((y-t)**2)

#cross entropy
def corss_entropy_err(y,t):
  delta=1e-7
  return -np.sum(t*np.log(y+delta))

次に、ipynb形式のファイルをpy形式のファイルに変換します。

Colabのメニューから、ファイル -> ダウンロード -> .pyをダウンロードを選択すると、自分のPCにcommon_func.py というPythonコードが出力されます。

出力されたcommon_func.pyをColab環境で呼び出すために、Goodle Driveへ配置します。

例では、MyDriver\machne以下に配置しています。

次にGoogle drivreをColab上にマウントします。

from google.colab import drive
drive.mount('/content/drive')
cd drivre/MyDrive/machine/

モジュールのインポートを行います。

試しに、corss_entropy_err()を読んで実行してみました。

import numpy as np
from common_func import softmax,corss_entropy_err
from common_func import numerial_grad

#sample data 1
t=[0,0,1,0,0,0,0,0,0,0] # number 2 is correct
y=[0.1,0.01,0.99,0.0,0.0,0.1,0.02,0.1,0.1,0.04]
ans = corss_entropy_err(np.array(y),np.array(t))  #0.010050234843405595
print(ans)

まとめ

今回、勾配降下法 gradient descent methodの実装と自前関数のモジュール化し、Colab環境へのインポートを行ってみました。

引き続き、ニューラルネットワークの学習について学んでいきたいと思います。

コメント

タイトルとURLをコピーしました