FC2カウンター FPGAの部屋 「ニューラルネットワークと深層学習」をやってみる1(CHAPTER 1 ニューラルネットワークを用いた手書き文字認識)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

「ニューラルネットワークと深層学習」をやってみる1(CHAPTER 1 ニューラルネットワークを用いた手書き文字認識)

とっても良い資料の「ニューラルネットワークと深層学習」をやってみよう。

そのうちの、「CHAPTER 1 CHAPTER 1 ニューラルネットワークを用いた手書き文字認識」をやってみる。
内容はWeb サイトをよく見てもらうとよくわかると思う。
更にGitHub にPython 2系のコードが置いてあって実際に試してみることができる。
試した環境はVirtualBox 5.1.20 上にインストールしたUbuntu 16.04 となっている。Python のバージョンは2.7.6 だった。

まずは、

git clone https://github.com/mnielsen/neural-networks-and-deep-learning.git

でGitHub からクローンした。
neural-networks-and-deep-learning ディレクトリが作成されて、中に data, fig, src ディレクトリがあった。
DLNN_1_170424.png

data ディレクトリには、mnist.pkl.gz たぶん手書き文字のデータが入っていた。
fig には、文字の画像やグラフが入っている。
DLNN_2_170424.png

src にはPython のソース・ファイルが入っている。
DLNN_3_170424.png

Python を動かすには src ディレクトリで動作させるが、危ないかな?ということで、DLNN_example ディレクトリを新規作成して、neural-networks-and-deep-learning ディレクトリの中身をコピー&ペーストした。
DLNN_4_170424.png

~/DNN/DLNN_example/src ディレクトリに行って、

python

とタイプしてPython をインタプリタモードで起動した。
次のコマンドを入力した

import mnist_loader
training_data, validation_data, test_data = \
mnist_loader.load_data_wrapper()
import network
net = network.Network([784, 30, 10])
net.SGD(training_data, 30, 10, 3.0, test_data=test_data)


DLNN_5_170424.png

学習が始まり、30回で終了した。
DLNN_6_170424.png
Epoch 28 で 86.27 % なので、書いてあるよりも性能が悪い。

次に、隠れニューロンを 30 から 100 に変更した。
net = network.Network([784, 100, 10])
net.SGD(training_data, 30, 10, 3.0, test_data=test_data)


DLNN_7_170424.png
DLNN_8_170424.png
Epoch 28 で 96.37 % だった。こっちは書いてあるのに近い。

学習率η=0.001 に変更した。

net = network.Network([784, 100, 10])
net.SGD(training_data, 30, 10, 0.001, test_data=test_data)


DLNN_9_170424.png
DLNN_10_170424.png
やはり学習が進まない。

学習率η=0.01 に変更した。

net = network.Network([784, 100, 10])
net.SGD(training_data, 30, 10, 0.01, test_data=test_data)


DLNN_11_170424.png
DLNN_12_170424.png
学習率η=0.001 ほどではないがやはり学習が遅い。

学習率η=100 にしてみた。

net = network.Network([784, 100, 10])
net.SGD(training_data, 30, 10, 100, test_data=test_data)


DLNN_13_170424.png
DLNN_14_170424.png
ほとんど学習できていない感じだ。

全てのコマンドと表示を貼っておく。

ono@ono-VirtualBox:~/DNN$ cd DLNN_example/
ono@ono-VirtualBox:~/DNN/DLNN_example$ ls
README.md  data  fig  requirements.txt  src
ono@ono-VirtualBox:~/DNN/DLNN_example$ cd src
ono@ono-VirtualBox:~/DNN/DLNN_example/src$ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mnist_loader
>>> import network
>>> net = network.Network([784, 30, 10])
>>> net.SGD(training_data, 30, 10, 3.0, test_data=test_data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'training_data' is not defined
>>> 
>>> q
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'q' is not defined
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> 
ono@ono-VirtualBox:~/DNN/DLNN_example/src$ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mnist_loader
>>> training_data, validation_data, test_data = \
... mnist_loader.load_data_wrapper()
>>> import network
>>> net = network.Network([784, 30, 10])
>>> net.SGD(training_data, 30, 10, 3.0, test_data=test_data)
Epoch 0: 7500 / 10000
Epoch 1: 8497 / 10000
Epoch 2: 8557 / 10000
Epoch 3: 8609 / 10000
Epoch 4: 8605 / 10000
Epoch 5: 8638 / 10000
Epoch 6: 8635 / 10000
Epoch 7: 8631 / 10000
Epoch 8: 8662 / 10000
Epoch 9: 8654 / 10000
Epoch 10: 8657 / 10000
Epoch 11: 8672 / 10000
Epoch 12: 8682 / 10000
Epoch 13: 8691 / 10000
Epoch 14: 8702 / 10000
Epoch 15: 8681 / 10000
Epoch 16: 8691 / 10000
Epoch 17: 8696 / 10000
Epoch 18: 8672 / 10000
Epoch 19: 8704 / 10000
Epoch 20: 8695 / 10000
Epoch 21: 8715 / 10000
Epoch 22: 8711 / 10000
Epoch 23: 8718 / 10000
Epoch 24: 8710 / 10000
Epoch 25: 8726 / 10000
Epoch 26: 8686 / 10000
Epoch 27: 8693 / 10000
Epoch 28: 8727 / 10000
Epoch 29: 8703 / 10000
>>> net = network.Network([784, 100, 10])
>>> net.SGD(training_data, 30, 10, 3.0, test_data=test_data)
Epoch 0: 8352 / 10000
Epoch 1: 8510 / 10000
Epoch 2: 8550 / 10000
Epoch 3: 8613 / 10000
Epoch 4: 8629 / 10000
Epoch 5: 8659 / 10000
Epoch 6: 8689 / 10000
Epoch 7: 8695 / 10000
Epoch 8: 8705 / 10000
Epoch 9: 8742 / 10000
Epoch 10: 9498 / 10000
Epoch 11: 9561 / 10000
Epoch 12: 9588 / 10000
Epoch 13: 9569 / 10000
Epoch 14: 9600 / 10000
Epoch 15: 9595 / 10000
Epoch 16: 9617 / 10000
Epoch 17: 9610 / 10000
Epoch 18: 9619 / 10000
Epoch 19: 9625 / 10000
Epoch 20: 9626 / 10000
Epoch 21: 9626 / 10000
Epoch 22: 9630 / 10000
Epoch 23: 9641 / 10000
Epoch 24: 9634 / 10000
Epoch 25: 9629 / 10000
Epoch 26: 9649 / 10000
Epoch 27: 9628 / 10000
Epoch 28: 9637 / 10000
Epoch 29: 9629 / 10000
>>> net = network.Network([784, 100, 10])
>>> net.SGD(training_data, 30, 10, 0.001, test_data=test_data)
Epoch 0: 1172 / 10000
Epoch 1: 1116 / 10000
Epoch 2: 1022 / 10000
Epoch 3: 1201 / 10000
Epoch 4: 1693 / 10000
Epoch 5: 1810 / 10000
Epoch 6: 1906 / 10000
Epoch 7: 1973 / 10000
Epoch 8: 2024 / 10000
Epoch 9: 2089 / 10000
Epoch 10: 2158 / 10000
Epoch 11: 2206 / 10000
Epoch 12: 2255 / 10000
Epoch 13: 2291 / 10000
Epoch 14: 2341 / 10000
Epoch 15: 2378 / 10000
Epoch 16: 2411 / 10000
Epoch 17: 2455 / 10000
Epoch 18: 2479 / 10000
Epoch 19: 2526 / 10000
Epoch 20: 2555 / 10000
Epoch 21: 2598 / 10000
Epoch 22: 2640 / 10000
Epoch 23: 2682 / 10000
Epoch 24: 2718 / 10000
Epoch 25: 2751 / 10000
Epoch 26: 2777 / 10000
Epoch 27: 2809 / 10000
Epoch 28: 2845 / 10000
Epoch 29: 2878 / 10000
>>> net = network.Network([784, 100, 10])
>>> net.SGD(training_data, 30, 10, 0.01, test_data=test_data)
Epoch 0: 1515 / 10000
Epoch 1: 1890 / 10000
Epoch 2: 2038 / 10000
Epoch 3: 2185 / 10000
Epoch 4: 2339 / 10000
Epoch 5: 2506 / 10000
Epoch 6: 2684 / 10000
Epoch 7: 2852 / 10000
Epoch 8: 2981 / 10000
Epoch 9: 3123 / 10000
Epoch 10: 3253 / 10000
Epoch 11: 3422 / 10000
Epoch 12: 3560 / 10000
Epoch 13: 3640 / 10000
Epoch 14: 3721 / 10000
Epoch 15: 3770 / 10000
Epoch 16: 3834 / 10000
Epoch 17: 3899 / 10000
Epoch 18: 3967 / 10000
Epoch 19: 4052 / 10000
Epoch 20: 4134 / 10000
Epoch 21: 4216 / 10000
Epoch 22: 4316 / 10000
Epoch 23: 4412 / 10000
Epoch 24: 4513 / 10000
Epoch 25: 4591 / 10000
Epoch 26: 4686 / 10000
Epoch 27: 4763 / 10000
Epoch 28: 4868 / 10000
Epoch 29: 4977 / 10000
>>> net = network.Network([784, 100, 10])
>>> net.SGD(training_data, 30, 10, 100, test_data=test_data)
Epoch 0: 894 / 10000
Epoch 1: 894 / 10000
Epoch 2: 894 / 10000
Epoch 3: 894 / 10000
Epoch 4: 894 / 10000
Epoch 5: 894 / 10000
Epoch 6: 894 / 10000
Epoch 7: 894 / 10000
Epoch 8: 894 / 10000
Epoch 9: 893 / 10000
Epoch 10: 893 / 10000
Epoch 11: 893 / 10000
Epoch 12: 893 / 10000
Epoch 13: 893 / 10000
Epoch 14: 893 / 10000
Epoch 15: 893 / 10000
Epoch 16: 893 / 10000
Epoch 17: 893 / 10000
Epoch 18: 893 / 10000
Epoch 19: 893 / 10000
Epoch 20: 892 / 10000
Epoch 21: 892 / 10000
Epoch 22: 892 / 10000
Epoch 23: 1262 / 10000
Epoch 24: 1262 / 10000
Epoch 25: 1262 / 10000
Epoch 26: 1262 / 10000
Epoch 27: 1262 / 10000
Epoch 28: 1262 / 10000
Epoch 29: 1262 / 10000
>>> 


  1. 2017年04月24日 21:32 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3783-01bd2c5b
この記事にトラックバックする(FC2ブログユーザー)