Google Colabを使ってCIFAR10を学習させてみた

CPUのみで機械学習しているとどんなに良いCPUであっても学習に時間がかかります。

特に畳み込みニューラルネットワークなどのパラメーター数が10万以上のものを扱うものだと、たった2層だけでも30分くらいかかることがあります。

GPUのような行列演算に特化したプロセッサを用いると短時間で学習させることができます。

そこで自分のマシンには一応非力ながらもグラフィックボードがあるのでGPUを使っての機械学習をさせてみようと思いました。

昨日までCUDAを入れたりcuDNN入れたりtensorflow-gpuを入れたりなど環境構築を頑張っていたのですがどうにもうまく構築できませんでした。

そこでGoogleの持っている機械学習用マシンのパワーを無料で使えるとかいう話を以前聞いたことがあったのを思い出し調べた結果Google Colabを今更ながら知ることとなりました。

Google Colabとは

Googleが提供している機械学習の研究の促進を目的としたクラウド上の開発環境です。

UIはJupyter Notebookに似ており同じ感覚で使うことが出来ます。

Google機械学習用マシンのパワーを無料でお借りすることができるという素晴らしいサービスです。

今回はこれを使ってCIFAR10を8層のCNNを使って100エポック学習させてみました。

CIFAR10とは

Canadian Institute For Advanced Researchが提供している32 x 32ピクセルのRGBデータのある物体識別用データセットです。

50k個のトレーニングセット、10k個のトレーニングセットとそれぞれの正解ラベルで構成されています。

CNNのモデル

今回使用したモデルは以下のとおりです。

8層の畳み込み層で構成されています。

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 32, 32, 32)        896       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 30, 30, 32)        9248      
_________________________________________________________________
dropout_1 (Dropout)          (None, 30, 30, 32)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 30, 30, 32)        9248      
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 28, 28, 32)        9248      
_________________________________________________________________
dropout_2 (Dropout)          (None, 28, 28, 32)        0         
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 32)        0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 14, 14, 32)        9248      
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 12, 12, 32)        9248      
_________________________________________________________________
dropout_3 (Dropout)          (None, 12, 12, 32)        0         
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 12, 12, 32)        9248      
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 10, 10, 32)        9248      
_________________________________________________________________
dropout_4 (Dropout)          (None, 10, 10, 32)        0         
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 5, 5, 32)          0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 800)               0         
_________________________________________________________________
dropout_5 (Dropout)          (None, 800)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 128)               102528    
_________________________________________________________________
dropout_6 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                1290      
=================================================================
Total params: 169,450
Trainable params: 169,450
Non-trainable params: 0
_________________________________________________________________

学習結果

トレーニングデータ誤認識率 53.4%

テストデータ誤認識率 71.6%

MNISTの学習結果と比べるととても低めです。

畳み込み層を多くしたせいでHigh Varianceなモデルになってしまったことが原因だと考えられます。

しかしこんなにも畳み込み層が多いモデルであるのに学習時間は1エポックあたりたったの30秒でした。

Googleのマシンパワーの素晴らしさに驚き、このパワーを無料で提供してくれるあたりさすがGoogle様ですね。

今回のNotebook

gist.github.com