こんにちわ。toruです。
この記事では前回に引き続きhyperasを使ってディープラーニングモデルのパラメータチューニングしてきます。今回はoptimizerで試してしたいと思います。
それではいきましょう!
早速最適化アルゴリズムを自動で求める
hyperasのやり方などは前回、前々回と説明しましたので省略させていただきますが、もしやり方がわからない方はこちらをご覧ください。
■第一回目

■第二回目



今回hyperasには、最適化オプティマイザーのSGD, Adam, Nadamの中から最適なものを選択させます。
有名なSGD(確率的勾配降下法オプティマイザ)はさておき、AdamとNadamはあまり馴染みがない人もいるかと思いますので、簡単に説明すると、
RMSPropとmomumtumを組み合わせたのがAdamで、RMSPropとNesterov momentumを組み合わせたのがNadamです。
1 |
model.compile(loss = 'categorical_crossentropy', optimizer = {{choice([SGD(), Adam(), Nadam()])}}, metrics = ['accuracy']) |
コンパイルレイヤーはこのように書きます。optimizerのところで3種類の最適化アルゴリズムから最適なものを選ばせます。
ちなみにhyperasでは最適値として出力される番号は0から始まります。今回で言うと、SGDが0、Adamが1、Nadamが2になります。
実行してみる
そして、これの実行結果が下記になります。
1 2 3 4 5 6 7 8 9 |
_________________________________________________________________ None {'optimizer': 1} 60000 train samples 10000 test samples 10000/10000 [==============================] - 0s 40us/step val_loss: 0.05316970861570535 val_acc: 0.9857000112533569 0.9857000112533569 0.05316970861570535 |
{'optimizer': 1} と出力されましたので、Adamが最適な値だと言うことがわかりました。
いよいよ最後の集大成
それでは第一弾、第二弾で求められたパラメータと組み合わせたモデルで、学習させてみましょう。組み合わせたプログラムがこちらになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
import time import matplotlib.pyplot as plt import keras from keras import models, optimizers from keras.callbacks import EarlyStopping from keras.datasets import mnist from keras.layers import Dense, Dropout from keras.models import Sequential from keras.optimizers import Adam def get_data () : # the data, shuffled and split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.reshape(60000, 784) # 2次元配列を1次元に変換 x_test = x_test.reshape(10000, 784) x_train = x_train.astype('float32') # int型をfloat32型に変換 x_test = x_test.astype('float32') x_train /= 255 # [0-255]の値を[0.0-1.0]に変換 x_test /= 255 print(x_train.shape[0], 'train samples') print(x_test.shape[0], 'test samples') y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) return x_train, x_test, y_train, y_test def model() : model = Sequential() model.add(Dense(512, activation = 'relu', input_shape = (784,))) model.add(Dropout(0.4844455237320119)) model.add(Dense(256, activation = 'relu')) model.add(Dropout(0.026079803111884514)) model.add(Dense(10, activation = 'softmax')) model.summary() return model def comp(model, x_train, x_test, y_train, y_test, batch_size, epochs) : early_stopping = EarlyStopping (monitor = 'val_loss', patience = 10, verbose = 1) model.compile(loss = 'categorical_crossentropy', optimizer = Adam(), metrics = ['accuracy']) hist = model.fit(x_train, y_train, batch_size = batch_size, epochs = epochs, verbose = 1, callbacks = [early_stopping], validation_data\ = (x_test, y_test)) val_loss, val_acc = model.evaluate(x_test, y_test, verbose = 1) return hist, val_loss, val_acc #===Parametar=== batch_size = 256 num_classes = 10 epochs = 100 start_time = time.time() x_train, x_test, y_train, y_test = get_data() model = model() hist, val_loss, val_acc = comp(model, x_train, x_test, y_train, y_test, batch_size, \ num_classes) finish_time = time.time() print("===============================") print("Procesisng time:", round(finish_time - start_time), "sec.") print("===============================") |
実行した結果がこちら。
1 2 3 4 5 6 |
=============================== Accuracy:98.60 % loss:6.04 % =============================== Procesisng time: 85 sec. =============================== |
第一弾でパラメータを何もチューニングしない状態でAccuracyが97.85%だったので、今回で約1%上がりました。まあこんなもんか。
まとめ
このシリーズではhyperasを使ってどれだけAccuracyを上げることができるかについて書いてきましたが、自分が想像していたより結果が出なくて少し悲しいです。
しかしhyperasの使い方はだいぶ理解できたのでこれを他のプログラムで応用できると思います。よかったら皆さんもhyperasを試してみてください。また、「ここ、こうしたほうがいいよ」的なのがあったら教えてください。
参考サイト:
https://qiita.com/wataoka/items/f46224ccccc5321543bd
https://qiita.com/FukuharaYohei/items/c8cc9d80452350b449eb