【Keras】ディープラーニングの時間を短縮する方法

 

ディープラーニングには処理にかなり時間がかかることがあります。下手すると丸一日以上かかることも。そんな時に覚えておくと良いことをまとめます。

EarlyStoppingを使う

ディープラーニングでは学習をいくらしても精度が向上しない場合があります。そういう場合は時間の無駄なので、EarlyStoppingを使って早々に学習を打ち切った方が良いです。

例えば、AlexnetでEarlyStoppingを使ってディープラーニングを行うときのコードは以下の通り。

# コンパイル
model = AlexNet()

# Early-stopping
early_stopping = EarlyStopping(patience=0, verbose=1)

# 訓練
history = model.fit(train_images, train_labels, 
                    batch_size=BATCH_SIZE,
                    epochs=EPOCH_NUM, 
                    verbose=1,
                    validation_split=0.1,
                    callbacks=[early_stopping])

 

callbacksにearly_stoppingを指定しています。学習時に学習精度が上がらなかった場合は指定されたエポック(繰り返し回数)を完了する前に終了します。

私はEarly_Stoppingを使うことで、精度は同じまま12時間以上かかっていた学習時間を20分程度に短縮できました。

 

読み込んだデータをpickleにする

例えば10GB以上の画像データを扱う場合は読み込みや型の変換に時間がかかります。学習する前に学習データ、ラベルデータpickleに保存しておき、学習時に読むことで時間の短縮になります。

  • pickleへ書き込む方法
#.pickleに書き込み
with open('X.pickle','wb') as f:
    pickle.dump(X, f, protocol=4)
    
with open('y.pickle','wb') as f:
    pickle.dump(y, f, protocol=4)

 

  • pickleから読み込む方法
#.pickleから読み出し
with open('X.pickle','rb') as f:
    X = pickle.load(f)
    
with open('y.pickle','rb') as f:
    y = pickle.load(f)

 

screenを使う

時間短縮ではありませんが、ディープラーニングにはscreenコマンドが便利です。

Jupyterでディープラーニングのコードを書いていると、クライアントのブラウザを閉じたときに処理が止まってしまいます。例えば、1日かかる処理を待っている間ブラウザを閉じれないことになります。

その点、サーバにSSHで接続しscreenコマンドでセッションを作り学習を動かしておけば好きな時に状況を確認できます。

・スクリーンコマンドの実行
screen

・セッションからデタッチ
control+a → d

・セッションの一覧を表示
screen -ls

・セッションの再開
screen -r

 

まとめ

ディープラーニングをする時にはKerasを使うと簡単に書けて便利です。CNNやAlexnetを使う場合には、処理に時間がかかるのでなるべく時間を短縮したり、学習処理を継続して走らせるように工夫した方が良いですね。

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog