深層畳み込みニューラルネットワーク(その②)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): ・・・ソフトマックス層
ConvPoolLayerとFullyConnectedLayerは、層の種類に応じて適切な出力の活性化を行っています。今回の記事では触れませんが、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 のプーリングウィンドウを用いて特徴を結合します。
PythonのAnaconda3をインストール(インストール方法)し、こちらのサイトの「Clone or Download」をクリックしてDeepLearningPython35-master.zipを取得し解凍する。以下のソースコードを「network3_test2.py」名で、「network3.py」がある同じフォルダに作成する。
MNISTの訓練データを解凍して、フォルダdataをDeepLearningPython35-master.zipを解凍した同じディレクトリに配置する。
フォルダ構成は以下のような感じになります。
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'
これは、DeepLearningPython35-master.zipのコミット(Latest commit a8da42f on 28 Aug)をダウンロードすることで修正されます。2017年8月28日以前にダウンロードしたファイルと、theanoのバージョン0.9の組み合わせでは色々エラーが起きて自己流で修正を加えていると以上のようなエラーとなります。
なので、新たにダウンロードしなおして
ファイルを実行すると、うまく動いてくれた。
実行結果
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
以上。
参考URL
Neural networks and deep learning