barus's diary

とても真面目なblogですにゃ

深層畳み込みニューラルネットワーク(その②)Pythonで動かす。~network3_test2.py

前回の続き。

 

前回(深層畳み込みニューラルネットワーク(その①)Pythonで動かす)は、準備運動としてPythonのコードnetwork3_test.pyを動かした。

 

今回は、network3_test2.py(ソースコードは下記)を動かします。

 

 少し前回のおさらい:

Network.pyの場合、隣接層がお互いに全結合するネットワークを使用していました。 これは、ネットワーク内の全てのニューロンが、隣接する層の全てのニューロンと結合している状態でした。

 

今回の場合、画像を分類するのに全結合層からなるネットワークを使わず、畳み込みニューラルネットワークを扱います。

畳み込みニューラルネットワークのはじまりは、1970年代まで遡ります。
しかし、近年の畳み込みニューラルネットワークブームの発端の論文は
1998年のby Yann LeCun, Léon Bottou, Yoshua Bengio, Patrick Haffnerによる
"Gradient-based learning applied to document recognition"です。
畳み込みネットワークは、空間的構造性を考慮した設計となっており、画像分類に非常に適しています。

 

なので、ネットワーク作成は以前(Network.py)は以下のような

net = Network([784 30 10])

単純なものでしたが、今回の畳み込みニューラルネットワーク(Network3.py)から引数が以下のようになってます。

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
)

Networkの引数が2つになっています。 

class Network(object):

def __init__(self, layers, mini_batch_size):

1番目のlayers引数には以下の3つが定義されており

class ConvPoolLayer(object):    ・・・畳み込み-プーリング層

class FullyConnectedLayer(object): ・・・全結合層

class SoftmaxLayer(object):      ・・・ソフトマックス層

ConvPoolLayerFullyConnectedLayerは、層の種類に応じて適切な出力の活性化を行っています。今回の記事では触れませんが、ConvPoolLayerと、FullyConnectedLayerは以下のように複数の配列として扱う使うことが出来るようです。

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)

 

2番目の引数mini_batch_sizeについては前回(Network.py)と同じ、バッチサイズであることが推測できます。

詳細にはこれ以上踏み込みません。 興味があれば、Theanoのドキュメント(Welcome — Theano 0.9.0 documentation)を参照してください。

  

Network3_test2.pyを作成する

 

 では、ネットワークの最初の層へ、畳み込み層を挿入するところから始めます。5×5 の局所受容野、1 のストライド長さ、20 個の特徴マップを使います。 さらにMaxプーリング層を挿入します。 このプーリング層は 2×2 のプーリングウィンドウを用いて特徴を結合します。

 f:id:hatakeka:20171021145339p:plain

  

PythonのAnaconda3をインストール(インストール方法)し、こちらのサイトの「Clone or Download」をクリックしてDeepLearningPython35-master.zipを取得し解凍する。以下のソースコードを「network3_test2.py」名で、「network3.py」がある同じフォルダに作成する。

 MNISTの訓練データを解凍して、フォルダdataをDeepLearningPython35-master.zipを解凍した同じディレクトリに配置する。

フォルダ構成は以下のような感じになります。

f:id:hatakeka:20171104123228p:plain

 

Network3_test2.py

import network3
from network3 import Network
from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
from network3 import ReLU

def main():
    training_data, validation_data, test_data = network3.load_data_shared()
    mini_batch_size = 100
    print ("network3\n");

    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, 1, mini_batch_size, 0.1, validation_data, test_data) return 0 if __name__ == "__main__": main()

 

 

 これを、Spyderもしくは、DOSで実行させると以下のようなエラーとなりました。

 

(注)後日追記。theanoのバージョンが0.9で、DeepLearningPython35-master.zipのコミット(Latest commit a8da42f on 28 Aug)以前にダウンロードしていた場合に以下のようなエラーとなる。theanoバージョン0.9とDeepLearningPython35-master.zip(Latest commit a8da42f on 28 Aug)であれば相性がよい。こちらを参照。 

 

TypeError: max_pool_2d_same_size() got an unexpected keyword argument 'ds'

 

f:id:hatakeka:20171104111919p:plain

 

これは、DeepLearningPython35-master.zipのコミット(Latest commit a8da42f on 28 Aug)をダウンロードすることで修正されます。2017年8月28日以前にダウンロードしたファイルと、theanoのバージョン0.9の組み合わせでは色々エラーが起きて自己流で修正を加えていると以上のようなエラーとなります。

 

なので、新たにダウンロードしなおして

 

 

ファイルを実行すると、うまく動いてくれた。

f:id:hatakeka:20171104113138p:plain

 

実行結果

 

Training mini-batch number 0
Training mini-batch number 1000
Training mini-batch number 2000
Training mini-batch number 3000
Training mini-batch number 4000
Epoch 0: validation accuracy 93.93%
This is the best validation accuracy to date.
The corresponding test accuracy is 93.27%
Finished training network.
Best validation accuracy of 93.93% obtained at iteration 4999
Corresponding test accuracy of 93.27%

 

 

時間が物凄くかかるので、GPUを使える環境なら使えるようにした方がよさげだが(下記)、大変そうなので、今回は放置。( ゚Д゚)

  

CUDA Toolkit 8.0 RC   

https://developer.nvidia.com/cuda-toolkit

 

 

以上。

 

 

参考URL

 Neural networks and deep learning