- Neural NetworkとTensorflowについて
- 画像の処理について
- CNNの学習(Keras)について
- Google Colabについて
- AutoKerasについて(今回記事)
数字を認識するConvolutional Neural Network (CNN)をkerasで作ってきました。これまでの記事では、一般的なCNNの構成で学習をさせました。一般的なCNNの構成がいつも最適ではありません。AutoKerasなら最適な構成を自動で見つけてくれます。
AutoKerasとは
KerasをベースにしたAutoMLシステム。テキサスA&M大学のDATA Labによって開発された。(https://autokeras.com/)
AutoML(Auto Machine Learning)とは、機械学習のアルゴリズムに必要なハイパーパラメーターの複数の組み合わせを自動で行ってくれるものです。ハイパーパラメーターとは、学習をさせる際にあらかじめ決めておく数字のことです。ハイパーパラメーターは、こうすれば最適になるという理論がないので、データサイエンティストが複数の組み合わせで何回も機械学習させ、結果を見て決めるものです。ハイパーパラメーターの探し方には、一定間隔で数値を変えるグリッドリサーチや、完全にランダムに探すランダムリサーチがあります。ランダムリサーチのほうが、見つける情報量が多いといわれています。
Neural Network(NN)は、層の構成もハイパーパラメーターとなります。自分で最適なモデルを探すには、少しずつNNの構成を変えながら、また学習率やdropout、loss関数、optimizerなどの組み合わせを少しずつ変えながら最適な構成を探していきます。NNは、調整できるパラメーターが多すぎます。学習時間も非常に時間がかかるので手動でやるには日が暮れてしまいます。そこでAutoKerasの出番です。
AutoKerasはNNの設計もすることなく、ローコードで最適な構成を見つけてくれます。見つけてくれたモデルは、一工夫するだけで通常のTensorflowのモデルとして使えます。
さっそくコードを書いてみます。前回までに作成した学習データ(numpy array)を読み込みます。
import numpy as np
X_train = np.load("/content/X_train.npy")
Y_train = np.load("/content/Y_train.npy")
それでは学習させます。
import autokeras as ak
clf = ak.ImageClassifier(max_trials=3)
clf.fit(X_train, Y_train, validation_split=0.15, epochs=10)
これだけです。
でも、何時間も計算に時間がかかります。モデルの試行回数はmax_trialsで指定できます。たくさん試せるのはいいのですが、その分かかる時間は長くなります。
モデルの評価
X_test = np.load("/content/X_test.npy")
Y_test = np.load("/content/Y_test.npy")
print('Accuracy: {accuracy}'.format(accuracy=clf.evaluate(X_test, Y_test)))
モデルの保存
model_autokeras = clf.export_model()
model_autokeras.save("/content/autokeras.h5")
モデルの読み込み
通常のtensorflowのモデル読み込みのパラメーターにcustom_objects = ak.CUSTOM_OBJECTSと指定してください。
from tensorflow.keras.models import load_model
import autokeras as ak
ak_model = load_model("/content/autokeras.h5",
custom_objects=ak.CUSTOM_OBJECTS)
読み込んでしまえば普通のKerasのモデルです。例えば、summaryをしてみます。
ak_model.summary()
見慣れない・知らない層がいっぱい並んでいます。これはCNNなんでしょうか。efficientnetが入っているのでぎりぎりCNNなのでしょう。
AutoKerasとGoogle Colab
Google ColabでもAutoKerasが使えます。普通に!pip install autokerasでインストールしてしまえばよいです。ただ、学習時間が長いので学習中にランタイムエラーが起こりまくります。工夫するしかありません。あきらめて自分のパソコンでやるのも選択肢です。私はmax_trial=3で1回保存まで成功し、後5回はランタイムエラーで学習がなかったことになっていました。
Autokerasにチェックポイント機能を付けてほしいと切に願います。
AutoKerasとGPU
tensorflow-gpuを実行できる環境を整えてしまえば、GPUを使って計算しているみたいです。
所感
NNの楽しいところ、自分で設計したモデルがいい成績を収める。少しずつ学習していき、優秀な機械学習モデルになる。といったところが全部取られてしまっている感じが否めません。CNNの設計に明るくない私は、AutoKerasの結果にボロ負けです。悲しかったです。
ただ、AutoKerasで見つけたよさげな構造をもとにさらに自分で調整すればもっといいモデルができるでしょう!
おまけ:autokerasモデルを完全にtensorflowだけで読み込めるようにする
基本的にautokerasで作ったモデルは保存した後、読み込む際にcustom_objectsとしてautokerasを読み込ませないといけません。例えば、flaskやfastAPIでherokuにデプロイしたい場合にはtensorflowとautokerasを環境に含めるので魔のslug size too large (max is 500M) エラーに苛まれます。サイズを減らすためにtensorflow-cpuを使いたいのですが、autokerasがそれを許してくれません。gpuも含んだバージョンを求めます。そのため、autokerasで作ったモデルでも完全にtensorflow単独で読み込めるようにしなければdeployできません。その方法を見つけました!!
tensorflow-liteを使用するというのが方法です。akモデルをtflight方式で保存し、tensorflow-liteでモデルを読み込み推測を実施します。
# akモデルの保存をフォルダで行う
new_model_ak.save("/content/akmodel")
# akモデルを読み込む
new_model_ak = tf.keras.models.load_model("/content/akmodel")
# tensorflow-liteの形式に変換する
converter = tf.lite.TFLiteConverter.from_keras_model(new_model_ak)
converter.target_spec.supported_ops = [
tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops.
tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
# tensorflow-liteの形式で保存する
open("converted_model.tflite", "wb").write(tflite_model)
tensorflow-liteはurlからpipできるのですが、そうしなくてもtensorflow-cpuからも使えます。herokuでurlからpipできるか分からなかったので、tensorflow-cpuを使いました。
以下のコードでtensorflow-liteのモデル読み込みと推論です。
以下のコードで変更が必要なのは、model_path=の所と、interpreter.set_tensorの変数の2番目だけです。ほとんどテンプレートです。
import numpy as np
import tensorflow as tf
# tensorflow-lightにモデルを読み込ませる
interpreter = tf.lite.Interpreter(model_path="/content/converted_akmodel.tflite")
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# predictを行うため、2番目の変数に予測したいデータをセットする
interpreter.set_tensor(input_details[0]['index'],
np.expand_dims(X_test[1], axis=0))
# predictの実行
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
# 結果表示
print(output_data)
上記のコードでnp.expand_dimがあるのは、dimentionが一致しない的なことを言われたので、次元を修正しました。
Cannot set tensor: Dimension mismatch. Got 3 but expected 4 for input 0.
上記の手続をとれば、autokerasから独立したモデルを作ることができます!