
電子書籍ニューラルネットワークと深層学習は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がいるんじゃぁ….という場合はこれを使うことにします。
AWSやGCP、Azure、FloydHub以外の選択肢です。
無料で使えます(研究用にってことで)
Leave a Reply