めるぱんブログ

とある医大生の勉強の記録です

PythonとKerasによるディープラーニング 第2章

第2章では実際にMNISTという手書きの数字データセットを用いてニューラルネットワークを試してみようという章でした。

まずKerasからMNISTのデータセットを呼び出しています。 最初のtrain_imagesとtrain_labelsは訓練データセットと呼ばれるものです。 train_imagesは60000枚の28×28ピクセルの手書き数字画像、train_labelsはその画像に対応した数字のデータです。 このデータセットを用いて学習を行っていきます。 一方、test_imagesとtest_labelsは10000枚の同様の画像と名前のデータです。 これを用いて実際に学習がうまくいっているのかをテストしていくイメージです。

続いてニューラルネットワークの構築を行います。 このlayer(層)を通すことで別の形式に入れたデータが変換されます。 ここではまず28×28の画像を512ユニットあるlayerを通します。その際に重みとバイアスをかけ、最終的にReLU関数で処理します。 次にそれらのデータを今回は0から9までの数字を分類するということなので10ユニットで出力します。 ここで用いるsoftmax関数は入れたデータを0から1までの間に収めてくれる、つまり確率にしてくれるという便利な関数です。 この2つのlayerを通すことで入力した画像が0である確率は何%、1である確率は何%...と分類してくれます。

先ほどのネットワークだけでは学習しっぱなしになってしまいフィードバックがされていません。 そこで重みを修正するために損失関数を用います。損失関数とは目的とされる結果と実際に得られた結果の差のことです。 この損失関数を今回は交差エントロピー誤差で出します。この損失関数を最小にすることで正解率を上げられます。 損失関数を減らす方法として微分の延長にある勾配降下法を用います。この部分を定義しているのがrmspropのオプティマイザです。 そして実際に学習がうまくいっているのかを正解率(accuracy)で監視します。

先の工程でニューラルネットワークは完成しているのでここでは入力する画像データの処理を行います。 reshapeを用いることで入力するデータの形を任意の形式に変更することができます。ここでは必要ないですが一応やっておきます。 astypeで今回は型をfloat32に、/ 255にすることで0から1の値にデータを正規化します。

ラベルの手順は第3章で勉強するみたいです。

そして最後に128サンプルのミニバッチで5回学習を繰り返します。 実際に学習した結果をテストデータで試すことができます。

とりあえず実際にやってみましたが、ゼロから作るDeepLearningを一度読んでいるおかげで、この章で実は一番詳しく書いてあったテンソルの演算や勾配についてはスッと理解できました。 実際に手を動かしてみることでKerasの使い方になれるということが私としてはメインであった章という感じです。 次の章も頑張って勉強しようと思います。