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


ニューラルネットワークと深層学習の6章にあるnetwork3.pyをubuntu 16.04 + Python3.xでやってみます。

畳み込みニューラルネットワークの実装です。

ソース GitHub


Python 2.x -> Python 3.xへの主なコード修正はこのページ参照

network3.pyの修正コードは以下参照


network3.pyでは機械学習用ライブラリとしてTheanoを使っています。

Theanoのインストール

Kerasをubuntu 16.04 LTS へインストールのページにTheanoのインストも書いています。

Theanoはもう開発中止になっているので、別途Keras + TensorFlowでもやってみる予定。

ただ現状、TheanoもMNISTもこれ以上やる意味はないので、思案中。

感覚というか勘というか….を養う意味でいろいろいじってみるのは重要か?

Jetson Nano(ubuntu 18.04 LTS)でも実行できます。


network3.pyで100のニューロンを含む隠れ層を1つだけを持つ浅いネットワークを
エポック数60、学習率0.1、ミニバッチサイズ10、正規化なしの条件で実行してみます。

実行用ファイル

run3.py

 

 

$ python3 run3.py

 

 

テキストとほぼ同じ精度です(が、ここでもnetworkやnetwor2と同様に重みとバイアスはランダムに初期化されているので、たまたまだと思います)。


network3.py

Jetson NanoのようにGPUが使える環境ではGPU = Trueですが、その際Print文はコメントアウトしておきましょう。

 


ソース(Python3.x)


工事中

テキストの課題を解かねば……

テキストの6章ではnetwork3.pyでいろいろな実験的試みを行っています。

GPUを使う場面もありそうです、さくらインターネットの高火力サーバーも使ってみる予定です。

 


network3.pyを使っていろいろなニューラルネットワークを試してみる

第六章で試しているコードです、ご参考までに。

データ拡張用のexpand_mnist.pyは実行すると本当に数分かかります。

全部をJetson Nanoで実行するのはチトつらい。GoogleのColaboratoryがいいかもしれない、現状Theanoも使えます。2019/04/04時点ではTheano==1.0.4のようです(最終バージョン)。

やってみたいアイデアがあったらコードを書いて実装してみて動くようだったらColabにあげる….という感じ?

Google Colaboratoryを使ってみます

 

(Trial-1)
100のニューロンを含む隠れ層1、訓練のエポック数は 60 、学習率は η=0.1、ミニバッチサイズは 10、正規化なしの条件で実行

>>>import network3
>>>from network3 import Network
>>>from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
>>>training_data, validation_data, test_data = network3.load_data_shared()
>>>mini_batch_size = 10
>>>net = Network([FullyConnectedLayer(n_in=784, n_out=100),SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>>net.SGD(training_data, 60, mini_batch_size, 0.1,validation_data, test_data)

 

JetsonでJupyter-notebook

 

 

(Trial-2)
ネットワークの最初の層へ、畳み込み-プーリング層を挿入

>>>import network3
>>>from network3 import Network
>>>from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
>>>training_data, validation_data, test_data = network3.load_data_shared()
>>>mini_batch_size = 10
>>>net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2)),
FullyConnectedLayer(n_in=20*12*12, n_out=100),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)

>>>net.SGD(training_data, 60, mini_batch_size, 0.1,
validation_data, test_data)

(Trial-3)
2つ目の畳み込み-プーリング層を挿入

>>>import network3
>>>from network3 import Network
>>>from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
>>>training_data, validation_data, test_data = network3.load_data_shared()
>>>mini_batch_size = 10
>>>net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2)),
ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2)),
FullyConnectedLayer(n_in=40*4*4, n_out=100),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)

>>>net.SGD(training_data, 60, mini_batch_size, 0.1,
validation_data, test_data)

(Trial-4)
活性化関数をシグモイドではなく、ReLUに変更、訓練のエポック数 60 、学習率 η=0.03 で訓練、パラメータ λ=0.1 としてL2 正規化を使用

>>>import network3
>>>from network3 import ReLU
>>>from network3 import Network
>>>from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
>>>training_data, validation_data, test_data = network3.load_data_shared()
>>>mini_batch_size = 10
>>>net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)

>>>net.SGD(training_data, 60, mini_batch_size, 0.03,
validation_data, test_data, lmbda=0.1)

(Trial-5)
結果を改良する別の手法としての訓練データの拡張
訓練データの各画像を1ピクセルずつ上下左右のいずれかの方向にずらして、入力の 50,000 のMNISTの訓練画像を、 250,000 に増やすことによって過適合を防ぐ効果が期待できる

$ python3 expand_mnist.py

>>>import network3
>>>from network3 import ReLU
>>>from network3 import Network
>>>from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
>>>mini_batch_size = 10
>>>training_data, validation_data, test_data = network3.load_data_shared()
>>>expanded_training_data, _, _ = network3.load_data_shared(
“../data/mnist_expanded.pkl.gz”)

>>>net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)

>>>net.SGD(expanded_training_data, 60, mini_batch_size, 0.03,
validation_data, test_data, lmbda=0.1)

(Trial-6)
サイズの大きな全結合層を追加してみる

>>>import network3
>>>from network3 import ReLU
>>>from network3 import Network
>>>from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
>>>mini_batch_size = 10
>>>training_data, validation_data, test_data = network3.load_data_shared()
>>>expanded_training_data, _, _ = network3.load_data_shared(
“../data/mnist_expanded.pkl.gz”)

>>>net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU),
FullyConnectedLayer(n_in=100, n_out=100, activation_fn=ReLU),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>>net.SGD(expanded_training_data, 60, mini_batch_size, 0.03,
validation_data, test_data, lmbda=0.1)

 

(Trial-7)
ドロップアウトを全結合層に適用してみる、訓練のエポック数 40、全結合層内のニューロン数 1,000
訓練するエポック数を 40 に減らすことで、ドロップアウトが過適合を抑制するため、高速に学習できる
ドロップアウトはニューロンの多くを効率的に省いているので、全結合層内のニューロン数の増量が必要

>>>import network3
>>>from network3 import ReLU
>>>from network3 import Network
>>>from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
>>>mini_batch_size = 10
>>>training_data, validation_data, test_data = network3.load_data_shared()
>>>expanded_training_data, _, _ = network3.load_data_shared(
“../data/mnist_expanded.pkl.gz”)

>>>net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
FullyConnectedLayer(
n_in=40*4*4, n_out=1000, activation_fn=ReLU, p_dropout=0.5),
FullyConnectedLayer(
n_in=1000, n_out=1000, activation_fn=ReLU, p_dropout=0.5),
SoftmaxLayer(n_in=1000, n_out=10, p_dropout=0.5)],
mini_batch_size)

>>>net.SGD(expanded_training_data, 40, mini_batch_size, 0.03,
validation_data, test_data)

 


 

 

Be the first to comment

Leave a Reply

Your email address will not be published.


*