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


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

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

 

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

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

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

 

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

 


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

PDF版 Word版(OpenOfficeでも開きますがLaTeXの表記が崩れます)

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

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

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

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

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

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

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

Anaconda Promptを起動します。

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

コードはPython2.x用なので、環境を変えます(Python3.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%でした。

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

 

データセットのロードと学習のコードはこんな感じです。

注:このコードでひっかかるところはあまりないと思われますが、最後の

sigmoid_prime(z)って何でしょう?

これは、その上で定義されているシグモイド関数の導関数ですが、これについてはニューラルネットワークと深層学習でも何も触れられていません(これは第三章の最初の演習になっています)。高校数学の復習問題です。シグモイド関数をzで微分します。連鎖律(合成関数の微分)を使ってみましょう。$$y(z) = 1 /(1 + e^{-z }) で、 u = (1 + e^{-z })、t= -zとします$$
途中でトリッキーと思える式変形が必要になりますが、頭の体操みたいなもんです、導関数をみちびいてみてください。y(z)’ = y(z)・(1 – y(z)) -> 解答

注:Gitクローンされたnetwrok.pyのコードとテキストのコードは少々違っています。

Gitクローンの方にはsigmoid_vecとかsigmoid_prime_vecとかの関数は使われていません、ただ、実行に問題はないです。

テキスト版のコードはGitHubにもうないので廃止されたのかも….。

ニューラルネットワークと深層学習に記述されているコードです(Python3.x版)

 


 

ubuntu 16.04 LTS + Python 3.xの環境の場合

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

(Pyhon3.xではmnist_loaderとnetworkのコードで若干修正が必要です)

 


Next

上記の学習用コードはCode repositoryにあるnetwork.pyのものです。

また、network3.pyにはTheanoを使った畳み込みネットワークのコードがあります。

ニューラルネットワークと深層学習の6章で使われていますが、ここには問題として「ネットワークを記録、再生する機能をnetwork3.pyに加えてください」というのがあります、これをやってみる予定(ちなみに、SaveとLoadのコードはnetwork2.pyで定義されています、これを参考にします)。

 


WisteriaHillは「さくらインターネット」の共用サーバーにお世話になっていますが、ここにはGPUを時間貸ししてくれるサービス(Tesla P40モデル)があります(さくら 高火力サーバー)。

1時間あたり300円前後だったと思います。

どうしてもGPUがいるんじゃぁ….という場合はこれを使うことにします。

AWSGCPAzureFloydHub以外の選択肢です。

 

無料で使えます(研究用にってことで)

Google Colaboratory  (FAQ)

Colaboratory

 


AI用語 メモ


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*