数字を分類するニューラルネットワークの実装をやってみる


電子書籍ニューラルネットワークと深層学習はNeural Networkって何?を理解するのに手ごろな内容になっています。

また、このテキストにはいくつもExerciseや「証明してみてください」があるので理解が深まります。

 

ここでは、既存のフレームワークは使わず、書籍の中の第一章(Chapter 1)にあるシグモイドニューロンを使って数字を分類するニューラルネットワークの実習コードを試してみます。

基本的にこれらのコードを実行するのにGPUは使いません。

必要になるのはChapter6でTheanoライブラリを使う時くらいです。

 

MNISTデータセットを使った非常にシンプルなもので、ハイパーパラメータがどんなものか体験しながら学習できます。

 


ニューラルネットワークと深層学習

各コードはLinuxで動かすのが前提のようですが、ここではWindows(64Bit)でやってみます。

Python実行環境が必要ですが、Windowsの場合はAnacondaを使ってみます。

AnacondaのインストールはDarknetをWindowsで使ってみる(学習準備編)を参照

PythonコードやMNISTデータセットなどの一式はCode repositoryにあります。

ダウンロードして適当な場所(例:c:\)に解凍しておきます。

ここでは、C:¥neural-networks-and-deep-learning-masterとしておきます。

AnacondaおよびPython2.7もインストール済として進めます。

Anaconda Promptを起動します。

実行ソースのあるディレクトリへ移動しておきます。

コードはPython2.x用なので、環境を変えます。

>activate python27 <–ここは各自インストール時の設定で読み換え

>python

Pythonシェルに入ります。

MNISTデータセットをロードします。

>>> import mnist_loader
>>> training_data, validation_data, test_data = \

コードを追加

… mnist_loader.load_data_wrapper()

 

ハイパーパラメータ

(Network設定)

MNISTの訓練用データは、手書き数字の28×28ピクセルの画像なので、入力層は28×28=784ニューロンからなっていいます。30個の隠れニューロンを持ち、10個の出力ニューロンを持つネットワークを設定します。

 

>>> import network
>>> net = network.Network([784, 30, 10])

 

30世代(Epoch)・ミニバッチサイズ10・訓練率η=3.0の条件で、MNISTのtraining_dataから確率的勾配降下法を使用して学習を実行します。

Chapter1には、確率的勾配降下法(Stochastic Gradient Descent)とミニバッチのPythonコードも紹介されています。誤差逆伝播法(Backpropagation)のコードはChapter2以降にあります。

>>> net.SGD(training_data, 30, 10, 3.0, test_data=test_data)

 

 

ピーク性能は28世代(Epoch 28)での95.33%でした。

テキスト通りではないですが、95%+αには到達していますね。


隠れニューロンを100個にしてみました。

確かに時間はかかりましたが、ピーク性能は28世代(Epoch 28)の96.40%でした。

なるほど、精度は上がってます。

 

To be continued.


 

 

 

Be the first to comment

Leave a Reply

Your email address will not be published.


*