「ゼロから作るDeepLearning」を写経してみる(3)「3章ニューラルネットワーク」
Deep Learningを学んでみたいので、以下の本を写経している。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 単行本(ソフトカバー) – 2016/9/24
斎藤 康毅 (著)
3672円
サポートサイト
https://github.com/oreilly-japan/deep-learning-from-scratch
前回は、2章を写経した。AND, NAND OR, XORを、pythonで実装して、面白かった。
http://twosquirrel.mints.ne.jp/?p=17088
今回は、3章 ニューラルネットワーク を写経してみる。
(環境)
Windows8.1
Python 3.5.2
Anaconda 4.1.1 (64-bit)
Jupyter Notebook (ipython) 4.2.0
(1)パーセプトロンからニューラルネットワークへ
パーセプトロン
において、h(x)という関数(活性化関数)を定義して、
活性化関数は、閾値を境にして出力が切り替わる関数で、「ステップ関数」や「階段関数」と呼ばれる。
(2)シグモイド関数(sigmoid function):ニューラルネットワークで用いられる活性化関数のひとつ
h(x) = \frac{1}{1+\exp(-x)}
ステップ関数の実装
(3)ステップ関数のグラフ
(4)シグモイド関数の実装
ううむ、どうしても、x軸の値がおかしい値になってしまう。
ググっても原因は分からなかった。。。とほほ。
(5)ReLU(Rectified Linear Unit)関数
h(x) =\begin{cases}x & (x > 0)\\0 & (x \leq 0)\end{cases}
import numpy as np
import matplotlib.pylab as pltdef relu(x):
return np.maximum(0, x)x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)
plt.plot(y)
plt.ylim(-1, 6) # y軸の範囲を指定
plt.show()
相変わらずx軸がくるっている。直し方は分からない。。。
(6)多次元配列
行列の内積(こちらが、高校数学でやっていた行列の積で、私にとっては違和感がない)
ニューラルネットワークの内積
このあたりは、元の本の絵を見ないとなんとも、、、
3層のニューラルネットワークの実装
こちらも、絵を見ながら、理解する。
最後の出力層では、活性化関数はσ()で表し、解く問題に応じて決める。
回帰問題では、σは恒等関数
2クラス分類問題では、σはシグモイド関数
多クラス分類では、σはソフトマックス関数を用いるのが一般的。
●実装のまとめ
3.5 出力層の設計
ニューラルネットワークは、「分類問題」と、「回帰問題」の両方に用いることができる。一般的に、出力層の活性化関数は、
分類問題 => 恒等関数(入力値そのままを出力)
回帰問題 => ソフトマックス関数
を用いる。
●ソフトマックス関数
なんともまあ、天からふって湧いたような関数
y_{k} = \frac{\exp(a_{k})} {\sum_1^n \exp( a_{i} ) }
e=2.7182…のネイピア数(自然対数の底)とのことだが、あらためて、不思議な数であるなあと思った。
いろいろな定義があるらしい。。。
https://ja.wikipedia.org/wiki/%E3%83%8D%E3%82%A4%E3%83%94%E3%82%A2%E6%95%B0
●ソフトマックス関数の実装
●ソフトマックス関数の実装上の注意
指数(ある数のべき乗)はすぐに大きな数になってしまうので、コンピュータで計算するときにオーバーフローして、数値が不安定になってしまう可能性がある。その対策方法。
入力信号の最大値cを引くことで、正しく計算できる。
ソフトマックス関数の特徴
3.6 手書き数字認識
MNISTデータセット
0から9までの数字画像(訓練画像60,000枚、テスト画像10,000枚)(28×28のグレー画像で、各ピクセルは0から255の値)
学習と推論
サポートサイト
https://github.com/oreilly-japan/deep-learning-from-scratch
から、dataset/mnist.py (MNISTデータセットのダウンロードから画像データのNumPy配列への変換までをサポートするPythonスクリプト) をダウンロードして、以下のようなファイル構成にしておく。自分は、ch03/ フォルダにいるものとする。
データのダウンロードに10分くらいかかったか。。。
MNIST画像の表示
どうしても、最後の、img_show(img) のところで、エラーになってしまって、画像が表示されない。
サポートサイト
https://github.com/oreilly-japan/deep-learning-from-scratch
のコードをコピペしてもダメ。
しかし、ch03/ フォルダに、mnist_show.py というファイルを作成し、サポートサイトのソースコードをコピペしてから、コマンドプロンプトで、 python mnist_show.py とすると、最後に 5 という画像が表示された。しかし、Windows8.1なので、変な画像表示ソフトが開いて、その画像を保存することなどはできなかった。
まあ、よくわからないけど、ここは飛ばすこととする。
●ニューラルネットワークの推論処理
ネットワークは、入力層を784(=28×28)、出力層を10個のニューロンで構成。
一つ目の隠れ層を50個、2つ目の隠れ層を100個のニューロンとする。
sample_weight.pkl を、ch03/ フォルダにダウンロード
sigmoid(x), softmax(x) 関数などの定義も加えておいて、
本と同様、 Accuracy: 0.9352 と表示された。
なんとか、ニューラルネットワーク自分でも少し触れた感じがしてうれしい!
●バッチ(batch、束)処理
100個ずつ処理することにより、バス帯域の負荷を軽減し、コンピュータが効率よく計算できるようになるらしい。。。
ここの理解はちょっと難しい。。。
ふう。少し疲れたが、やっていてとても楽しい!
(参考)Online Latex Equation Editor – Sciweavers
http://www.sciweavers.org/free-online-latex-equation-editor
ディスカッション
コメント一覧
まだ、コメントがありません