AdaNet を動かしてみる
2018/12/01
環境
tensorflow のバージョンは、 1.9.0 以上となっています。 今回は、tensorflow-gpu 1.10.1 を使用しました。 また、tensorboard のバージョンは 1.10.0 で、Python のバージョンは 3.6.5 です。
また、adanet は pip でインストールできるようになっているので、
pip install adanet
を実行します。
これで準備は完了です。
python の環境が手元にない方は、
https://hub.docker.com/r/tensorflow/tensorflow/tags/\
から Docker image をとってきて実行すると良いと思います。
また、GTX1080Ti が載ったサーバー上で実験を行いました。
GPU を使うと実行速度が上がるという利点がありますが、なくても動くと思います。
コード
今回は、Jupyter Notebook 上で実行してみました。
参考にしたコードはこちら。
少し階層が深いですが、ちゃんとチュートリアルが準備されていていい感じです。
同階層に、adanet_objective.ipynb というファイルも準備されています。
前者は、Fashion Mnist を使ったチュートリアルで、後者はBoston Housing Dataset を使ったチュートリアルです。
どちらも、コピペするとサクッと動かすことができます。
便利!
やったこと
チュートリアルと殆ど変わらないんですが、cifar10 の学習を動かしてみました。
上記の Jupyter Notebook を数箇所変更します。
画像のサイズを 28 -> 32 に変更する。
画像のチャンネルを 3 チャンネルとする。
ぐらいです。
例)
before
tf.data.Dataset.from_generator(
generator(x_train, y_train),
(tf.float32, tf.int32),
((28, 28), ())
)
after
tf.data.Dataset.from_generator(
generator(x_train, y_train),
(tf.float32, tf.int32),
((32, 32, 3), ())
)
学習準備
AutoML とはいえ、いくつかのパラメータ調整が必要です。
私は、以下のように設定しました。
LEARNING_RATE = 0.003 #@param {type:"number"}
TRAIN_STEPS = 50000 #@param {type:"integer"}
ADANET_ITERATIONS = 10 #@param {type:"integer"}
それぞれのパラメータを説明すると、
- LEARNING_RATE
学習率と言われるパラメータです。
学習速度と学習精度を決めます。
大きい値にすればするほど早く学習しますが、雑になります。 - TRAIN_STEPS
どのぐらいの時間(回数)学習をするかを決めるパラメータです。
大きすぎると過学習を引き起こしてしまいます。 - ADANET_ITERATIONS
AdaNet に特有のパラメータです。
TRAIN_STEPS の間に何回ネットワークの探索を行うかを決めます。
大きいときと小さい時で、どのように変わるのか正直良くわかってないです。
学習の結果
学習を開始すると、
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp0x8sqcds
という文字列が現れます。
この、 /tmp/tmp0x8sqcds
を使って Tensorboard を起動できます。
Tensorboard というのは、学習の過程や結果を見ることができるツールです。
tensorboard --port 任意のポート --logdir /tmp/tmp0x8sqcds
というふうに起動した後、
http://(localhost or サーバーの IP):任意のポート
にアクセスすると閲覧できます。
以下が、TensorBoard の出力です。
これを見ると、5000回に1回、新しい線が現れている箇所があることが分かります。
これは、AdaNet が新しいネットワークを学習している箇所です。
様々な組み合わせでニューラルネットを学習し、よりよい精度のネットワークを構築していきます。
また、TensorBoard の画像内、上段左から 3 番目のグラフ(accuracy/adanet/subnetwork) を見ると、精度が下がったネットワークはそれ以上学習していないことが分かります。
これにより、ネットワークを高速化しているのだと考えられます。
2段目の adanet_loss は、徐々に下がっていっています。
ニューラルネットは、この loss と呼ばれるものを最小化するように学習を行うので、
正しく学習が進んでいるものだと分かります。
ただし、Accuracy と言われるモデルの正答率は、44% 程度と非常に低いものになっています。
ただ動かしただけで満足がいく結果が出るのかな? と期待していたのですが、ちょっとがっかりな結果でした。
Future Work
今後、どうやったら高い精度が出るのかを引き続き調査し、変更すべきパラメータの選定などを行ってみたいと思います。
また、画像の識別以外のタスクにも使ってみようと思います。
Yasuaki Hamano
I'm a software engineer in Fukuoka, Japan. Recently, I am developing machine learning models using TensorFlow, and also developing Web services by using PHP.