深層学習実践入門-1

これから説明する内容について

今回から深層学習を実際にやってみたいという方に向けて、私が実際に採用している方法について説明していきたいと思います。

基本的には理系の方、プログラムに興味がある方向けですが、そんなに難しいことではないのでプログラム初心者の方も是非この深層学習の世界に興味を持って、実践していただければと思います。

最近ではAI技術が発展しすぎて、専門でない人でもちょっとデータを入力すればパッと結果が出力されるようなプラットフォームやアプリ等もあるようですが、もう少しプログラミング寄りの内容について説明していきます。
(こういった類のものも、後々余裕があれば触っていきたいとは思っていますが・・・)

とはいえ、実は深層学習や機械学習の分野で用いられる手法はすでにパッケージ化が進んでおり、プログラミングによる方法であっても、最先端の手法や独自の手法等を実装するのでなければ出来合いのパーツをちょこちょこっと組み合わせるだけで実行できてしまいます。

例:手書き数字認識(MNIST)

少し例をお見せしたいと思います。
(イメージを掴んでもらうための例なので、内容を理解する必要はないです。)

MNISTという有名な手書き数字(0~9)のデータセットを使用して手書き数字を認識モデルを作成します。

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation,MaxPooling2D,Conv2D,Flatten
from keras.optimizers import Adam 
from keras.utils import np_utils
import time
import numpy as np
import os

 
#モデルを作成する関数
def build_model():
    model = Sequential()
    model.add(Conv2D(16,(3,3),input_shape = (28,28,1)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size = (2,2)))

    model.add(Conv2D(32,(3,3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size = (2,2)))

    model.add(Flatten())
 
    model.add(Dense(64))
    model.add(Activation('relu'))
    model.add(Dropout(0.2))
 
    model.add(Dense(10))
    model.add(Activation('softmax'))
 

    model.compile(
    loss='categorical_crossentropy',
    optimizer=Adam(),
    metrics=['accuracy'])
 
    return model
 
#ここから実際に実行
if __name__ == "__main__":
    
   
    #学習用データの読み込みと下準備(MNIST:手書きデータ)
    (X_train, y_train), (X_test, y_test) = mnist.load_data()
    X_train = X_train.reshape(60000, 28,28,1).astype('float32')
    X_test = X_test.reshape(10000, 28,28,1).astype('float32')
    X_train /= 255
    X_test /= 255
 
    y_train = np_utils.to_categorical(y_train, 10)
    y_test = np_utils.to_categorical(y_test, 10)
 
    #モデルを作成、モデルの内容を表示させる。
    model = build_model()
    model.summary()
    
    #学習を実行
    time_start = time.time()
    model.fit(X_train, y_train,batch_size=128,epoch=20,
    validation_data=(X_test, y_test)
    )

    #(学習にかかった時間を表示) 
    time_end = time.time()
    print("time:",(time_end - time_start))
 
    # モデルの評価を行う
    score = model.evaluate(X_test, y_test, verbose=1)
 
    print('loss=', score[0])
    print('accuracy=', score[1])

これで学習完了です。
(モデルの保存や、モデルを使用した予測は行っていません。)

結果を一部抜粋したものが下記になります。

time: 40.78832244873047
10000/10000 [==============================] - 1s 57us/step
loss= 0.030270389226842463
accuracy= 0.9919000267982483

MNISTには訓練用のデータと評価用のデータが含まれており、訓練用データで訓練したモデルを評価用のデータで評価した結果を表示しています。
(訓練データを用いてモデルを評価するとモデルが過学習を起こしていることに気づかなくなってしまうので、学習に使用していない評価用のデータで評価を行います。)

一応簡単に中身に触れておくと、学習はGoogole Colaboratory のGPUランタイムを使用して40秒程度でした。lossは計算誤差の数値です。accuracyは正答率で、99.1%という非常に高い数値を示しています。

プログラミング慣れしてない方には少し長く感じるかもしれませんが、プログラミングをしたことがある方であれば、実際にできることに対してコードの量がとても少ないと思うのではないかと思います。

上記のコードで学習したモデルで文字認識をできるようにしました。
下記のリンク先で実際に体験していただければ、より機械学習に対するイメージができるのではないかと思います。

手書き数字認識 (暫定版。今後改修予定。) 

正答率はそこそこかなと思いますが、これを手書き数字データを持ってきて、学習させて認識させるのに必要なコードが上記の量というのは、個人的に驚くべきことだと思います。

このように深層学習の敷居はどんどん低くなっており、専門でない方でも簡単にその分野に入っていけるようになっています。

次回から、このような深層学習を実際に実行するための環境づくりと、上記コードの中身の説明を順番にしていきたいと思います。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です