Top View


Author hamano

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

今後、どうやったら高い精度が出るのかを引き続き調査し、変更すべきパラメータの選定などを行ってみたいと思います。
また、画像の識別以外のタスクにも使ってみようと思います。

hamano

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.