ブログ名

第1回 Kerasでディープラーニングを学ぶ

f:id:iTD_GRP:20191008201132p:plain

Kerasでディープラーニングを学ぶ

 この記事ではPython機械学習を始める方向けに, 機械学習の基礎知識と Python のライブラリである Keras を使う環境の構築と基本的な使い方を解説します.

ニューラルネットワークとは

 まず機械学習の基本であるニューラルネットワークについて説明します. ニューラルネットワークとは, 脳の神経系を数式を使って表したものです. 複数のニューロンの結合で入力層, 隠れ層(中間層), 出力層により構成され, それぞれの結合には結合重みが存在します. f:id:iTD_GRP:20191008201148p:plain  上の図は 3 層から成るニューラルネットワークを表しています. 入力層と隠れ層, 隠れ層と出力層は互いにニューロンが全結合の状態(2 層間のニューロン同士が全て繋がっている状態)にあります. 結合重みは矢印の部分に存在します.  入力側から来た値と結合重みの積がニューロンに入力され, ニューロン内で処理された数値が閾値を超えることで発火(1 を出力)し超えなかった場合は 0 が出力されます. このニューロン内での処理に使われる関数を活性化関数といいます. 最終的な出力値を目的の値に近づけるために結合重みを修正する作業が機械学習になります.

Kerasとは

 Keras は機械学習用ライブラリである TensorFlow, CNTK または Theano をバックエンドで利用する Python のライブラリです. バックエンドで使われるライブラリと比べ分かりやすく作られています. 日本語の Keras 公式ドキュメントがあるので参照してみて下さい.

環境構築

 > pip install Kerasで Keras をインストールします. Anaconda を使う場合は> conda install Kerasでも可. 最低限必要なものはこれで揃います. また, OpenCV や Pillow などの画像処理ライブラリも使うことがあるのでインストールしておきましょう.  Keras は TensorFlow をバックエンドとして利用していますが, 学習に GPU を使用したい場合にはTensorFlowGPU を使います. 自前のグラフィックボードを持っている方はこちらを使うのをおすすめします.

基本的な使い方

 まずはKerasのサンプルコードを参考にしながら基本的な全結合のニューラルネットワークの作成方法を解説します.

使用した環境

Python 本体 ・Python 3.6 Python ライブラリ ・Keras 2.2.4 ・TensorFlowGPU 1.13.1 PC 環境 ・CPU … Core i5 7600 ・グラフィックボード … GeForce GTX1070 ・RAM … 16GB

Anaconda の仮想環境にて実行しました.

サンプル解説

サンプル10~14行目の部分

import keras # Keras のインポート
from keras.datasets import mnist # データセット
from keras.models import Sequential # 線形モデル
from keras.layers import Dense, Dropout # 全結合層, 入力を一定の割合で破棄する層
from keras.optimizers import RMSprop # オプティマイザ

 mnist とは Keras 公式より提供されている手書き文字のデータセットで, このサンプルでは 0~9の手書き文字の学習を行います. データセットには以下のような画像が含まれています. f:id:iTD_GRP:20191008201215p:plain  Sequentialは学習モデルの種類の 1 つで, 層(レイヤー)同士が線形結合しているモデルであり, DenseDropoutは層の種類を表しています.  Denseニューラルネットワークパーセプトロン同士が全結合の状態にある層(全結合層), Dropoutは入力された情報を指定された割合で破棄する層です.  機械学習では, 入力された情報を全て学習していると訓練データに適合し過ぎてしまい, 訓練データ以外で使うと精度が下がってしまう現象が発生することがあります. この状態を過学習といい, これを防ぐために学習段階で入力データをある程度破棄する必要が出てくるのです.

サンプル16~18行目の部分

batch_size = 128 # バッチサイズ
num_classes = 10 # クラス数
epochs = 20 # エポック数

 batch_sizeは, 学習用データから一度に取り出すデータの数を表しています. データ全体から一定数のデータをランダムに選んで学習するミニバッチ法という学習方法によるものです.  num_classesはデータを何種類に分類して学習するかを表しています. このサンプルでは 0~9 の 10 種類に分類するため, 10 と指定されています.  epochsは学習を何回繰り返すかを表しています. 学習データ全体を 1 周した段階で 1 回とカウント します. 基本的に多い程精度は上がりますが, 当然学習にかかる時間は増えていきます.

サンプル 20~34 行目の部分

# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data() # データセットのロード

x_train = x_train.reshape(60000, 784) # 訓練用データの RGB を 1 次元配列に変換
x_test = x_test.reshape(10000, 784) # 検証用データの RGB を 1 次元配列に変換
x_train = x_train.astype('float32') # 変換した RGB データを float32 型へ
x_test = x_test.astype('float32') # 上と同じ
x_train /= 255 # 255 で除算し 0 か 1 の 2 値に変換
x_test /= 255 # 上と同じ
print(x_train.shape[0], 'train samples') # 訓練用データの数を表示
print(x_test.shape[0], 'test samples') # 検証用データの数を表示

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes) # 訓練用のラベルを変換
y_test = keras.utils.to_categorical(y_test, num_classes) # 検証用のラベルを変換

x_train : 訓練用データの RGB x_test : 検証用データの RGB y_train : 訓練用データのラベル(ここでは画像が 0~9 までの何を表しているかの情報) y_test : 検証用データのラベル

を表しています.  rehape関数の引数はデータ数, RGB の次元数の順に表されています. 訓練用に 60000, 検証用に10000 個で, RGB データは(28*28=)784 次元で読み込まれています.  to_categorical関数はラベルデータを 0 か 1 の 2 値の配列に変換しています. 引数に変換対象のベクトル, クラス数, データ型の 3 つを持ちます. 引数を指定しなかった場合, デフォルトで設定されている値になります(これ以外の関数も基本的に同様).

サンプル 36~47 行目の部分

model = Sequential() # モデルの種類の指定

model.add(Dense(512, activation='relu', input_shape=(784,))) # 全結合層の追加
model.add(Dropout(0.2)) # 入力破棄層の追加
model.add(Dense(512, activation='relu')) # 全結合層の追加
model.add(Dropout(0.2)) # 入力破棄層の追加
model.add(Dense(num_classes, activation='softmax')) # 全結合層の追加

model.summary() # モデルの詳細を表示

model.compile(loss='categorical_crossentropy', # モデルのコンパイル
              optimizer=RMSprop(),
              metrics=['accuracy'])

層の追加は.addで行います. 1 層目の Dense の引数は出力次元数, 活性化関数, 入力次元数を表しています. Keras で使える活性化関数の詳細は公式ドキュメントを参照してください. Dropout の引数は破棄する割合を表します. サンプルでは 2 層とも 2 割の入力データを破棄しています. .compileでは損失関数, 結合重みの修正に使うアルゴリズム, 評価関数を指定しています. これらの詳細も公式ドキュメントを参照して下さい.

サンプル 49 行目以降

history = model.fit(x_train, y_train, # モデルの学習
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0) # 精度評価
print('Test loss:', score[0]) # 損失関数の評価値
print('Test accuracy:', score[1]) # 検証用データでの正解率

 .fitの引数は今まで説明した内容の通りです. verboseは学習経過のログ出力の有無を 0(出力なし)か 1(出力あり)で,Validation_dataは検証用データを指定します.  .evaluateで学習したモデルの評価を行います. ここでは score[0]が損失関数の評価値, score[1]が検証用データでの正解率を表します.

実行結果

Test loss: 0.10954435647160994 Test accuracy: 0.9839

 かかった時間は 1 エポックおよそ 5 秒で 100 秒程度でした. CPU のみで処理するともう少しかかります. 精度は 98.39%です.

最後に

 以上が Keras を使った学習経過になります. このサンプルでは線形モデルを作成しましたが, できることはまだ多くあります. 他の学習方法を使ったサンプルもあるので, 興味が湧いた方は確認してみて下さい. サンプルで何をしているのかはここで解説した基本的な知識で分かると思います.


次の記事へ

目次へ戻る