ニューラルネットワークと深層学習の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文はコメントアウトしておきましょう。
工事中
テキストの課題を解かねば……
テキストの6章ではnetwork3.pyでいろいろな実験的試みを行っています。
GPUを使う場面もありそうです、さくらインターネットの高火力サーバーも使ってみる予定です。
network3.pyを使っていろいろなニューラルネットワークを試してみる
第六章で試しているコードです、ご参考までに。
データ拡張用のexpand_mnist.pyは実行すると本当に数分かかります。
全部をJetson Nanoで実行するのはチトつらい。GoogleのColaboratoryがいいかもしれない、現状Theanoも使えます。2019/04/04時点ではTheano==1.0.4のようです(最終バージョン)。
やってみたいアイデアがあったらコードを書いて実装してみて動くようだったらColabにあげる….という感じ?
(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)
Leave a Reply