アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うこと。

おもちゃディープラーニングのPythonソースコードをGitHubにアップしました。

一旦ケリをつけたので、勉強の為に作った「おもちゃディープラーニング」をGitHubリポジトリに公開しました。

github.com

 

以降に、補足説明をしますが、今回の記事は、内容的に、pythonおよびGitHubディープラーニング等についての知識がある程度ある方でないと、わからない部分が多いかもしれません。ご勘弁を・・・。

 

試す場合は、GitHubの「clone or download」の「Download ZIP」でZIPファイルをダウンロードして、適当なフォルダに展開します。

f:id:arakan_no_boku:20170305231457j:plain

 

実行には、anaconda(python3の方)が必要です。

Download Anaconda Now! | Continuum

 

anacondaをインストール後、IDLEを起動し、「test_exec01.py」か「test_exec02.py」を開きます。IDLEから単体テストとして動かすように書いているので、ソースを開いた状態のまま、「F5」キーを押して実行します。

f:id:arakan_no_boku:20170305233219j:plain

 

動いたら上図のように、実行過程が表示されます。初回の実行だけ、上例のようにWarningが表示される場合がありますが、気にしないでください。

 

ここでやっている処理は、MNISTの訓練用手書き数字を利用した学習とテストデータを利用した分類テストです。上記の0.958等の数字は正解率です。

 

ちょっと、時間はかかりますが、学習を繰り返す内に、だんだんと正解率があがっている様子を見ることができます。

 

ただ、動かすだけでなく、ニューラルネットワークの層の深さを変えるなど変化させて試したい方のために、test_exec01.py のポイントを簡単に補足しておきます。

 

(x_test,t_test) = gd.get_normed_testdata()

(x_train,t_train) = gd.get_normed_traindata()

この2行で、MNISTデータ・セットからデータを取り出します。訓練用(train)は60000件、試験用(test)は10000件あります。

 

network = ai.BokuNet(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100],output_size=10,dropout=False,batchnorm=True,pklname='bokuparams.pkl')

 

 この1行で、ニューラルネットワークを構築します。変更可能なパラメータは以下です。

  • hidden_size_list : ネットワークの深さを指定します。
  • dropout:Trueにすると、Dropoutレイヤーを生成します。
  • batchnorm:Trueにすると、Batchnormレイヤーを生成します。
  • pklname:学習結果を読み込むInputファイル名を指定します。

 

おもちゃディープラーニングでは、hidden_size_listの[100]の指定ひとつに対して、以下の最大4つのレイヤーで構成する層をひとつ生成します。

f:id:arakan_no_boku:20170307003230j:plain

 

デフォルトでは100が6つあるので、深さは6層になり、最後に出力用のSoftMax層があるので、合計7層の深さのネットワークを生成します。

 

trainer= tr.Trainer(network, x_train, t_train, x_test, t_test,epoch=10, batch_size=100,pklname='bokuparams.pkl')

trainer.train()

 この2行で、学習・評価オブジェクトを生成して実行します。変更可能なパラメータは以下の3つです。

  • epoch:繰り返すエポック数を指定します。
  • batch_size:1回に処理するミニバッチのサイズを指定します。
  • pklname:学習結果を書き出す保存用OUTPUTファイル名

 

例えば、学習データが60000件で、batch_sizeが100なら、100件ずつランダムに抽出して、600回(60000÷100)学習を繰り返します。その600回で1epoch(エポック)と数えます。

 

テストは1epoch毎に行い正解率を計算します。例のように、epoch=10であれば、ミニバッチ6000回の学習と、10回のテストを行うことになります。

 

活性化関数は、sigmoid と reluの2種類実装しています。

 

オプティマイザは、SGD、Momentum、AdaGrad、Adam、の4種類実装しています。

 

活性化関数とオプチティマイザの切り替えは、bokunet.py、trainer.pyのソースの中にある静的パラメータをコメントを参考に書き換えてください。(オプティマイザの選択肢には、RMSpropとNesterovもありますが、選んでもあまり変化がない・・かもしれません。一応、実装はしてますが、いまいち自信がありません。)

 

 そもそも、おもちゃディープラーニングは、まったく知識のないところから、色々なディープラーニング本やサイトの情報、および、別の方が公開していただいているソースなどを参考にさせていただいた寄せ集めでもあります。(実は、最初の2回は途中で破綻してしまって、3回目の作り直しではありますけど)

 

なので、著作権等々主張する気はさらさらありません。自由に修正しておもちゃとして遊んでいただければいいかなと思ってます。(潰したって、またダウンロードすればいいだけですしね)

 

python自体もこれを作るために、一から覚えました。なので、詳しい方が見るとおかしな部分もあるかもしれませんし、不具合を見落としているところもあるかもしれません。見つけても、黙って許してくださいね。(笑)