tensorflow/slimで独自データtrain

githubで公開されているtensorflow/models/research/slimを使って、独自データセットをgoogle cloud mlでトレーニング
https://github.com/tensorflow/models.git

#データセットをTFRecordへ変更
独自データセットは3クラス(Mont_Saint_Michel、Sagrada_Familia、Taj_Mahal)
1クラス200枚、合計600枚


download_and_convert_data.pyを使用して独自データをTFRecord形式へ変換
ここで画像をシャッフルしてからtrainとtestに分けられる
・train 500枚
・test 100枚

![スクリーンショット 2018-02-25 16.31.29.png](https://qiita-image-store.s3.amazonaws.com/0/239266/7ee4f60e-a035-150e-7461-bdde38d97a05.png)

#訓練済みモデルダウンロード
inception V3で事前に訓練されたモデルを微調整するので、訓練済みモデルをダウンロード

```shell
$ CHECKPOINT_DIR=/tmp/checkpoints
$ mkdir ${CHECKPOINT_DIR}
$ wget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz
$ tar -xvf inception_v3_2016_08_28.tar.gz
$ mv inception_v3.ckpt ${CHECKPOINT_DIR}
$ rm inception_v3_2016_08_28.tar.gz
```

#トレーニング

```shell
gcloud ml-engine jobs submit training $JOB_NAME \
--job-dir $OUTPUT_PATH \
--runtime-version 1.4 \
--module-name slim.train_image_classifier \
--package-path slim/ \
--region $REGION \
--scale-tier BASIC_GPU \
-- \
--train_dir=${OUTPUT_PATH} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=flowers \
--dataset_split_name=train \
--model_name=inception_v3 \
--checkpoint_path=${CHECKPOINT_PATH} \
--checkpoint_exclude_scopes=InceptionV3/Logits,InceptionV3/AuxLogits \
--trainable_scopes=InceptionV3/Logits,InceptionV3/AuxLogits
```

![スクリーンショット 2018-02-25 17.13.17.png](https://qiita-image-store.s3.amazonaws.com/0/239266/d8b9ea81-990d-b333-6bd2-04136c98b99c.png)
==================================================================
![スクリーンショット 2018-02-25 18.51.09.png](https://qiita-image-store.s3.amazonaws.com/0/239266/59f74644-882f-98e5-d96c-fa3a38d1897e.png)
==================================================================
![スクリーンショット 2018-02-25 18.50.19.png](https://qiita-image-store.s3.amazonaws.com/0/239266/3a4a79b1-78bc-4132-d2c6-ae5713055b9b.png)
==================================================================
![スクリーンショット 2018-02-25 18.50.36.png](https://qiita-image-store.s3.amazonaws.com/0/239266/3d9dee81-b5c7-0d0a-d6af-83932f6f45d3.png)

lossが下がらなくなってきたので途中でジョブを停止

#テスト
最後のチェックポイントを指定してeval_image_classifier.pyを使ってテスト

```shell
gcloud ml-engine jobs submit training $JOB_NAME \
--job-dir $OUTPUT_PATH \
--runtime-version 1.4 \
--module-name slim.eval_image_classifier \
--package-path slim/ \
--region $REGION \
--scale-tier BASIC_GPU \
-- \
--alsologtostderr \
--checkpoint_path=$OUTPUT_PATH/model.ckpt-1450 \
--dataset_dir=${DATASET_DIR} \
--dataset_name=flowers \
--dataset_split_name=validation \
--model_name=inception_v3
```
![スクリーンショット 2018-02-25 19.10.13.png](https://qiita-image-store.s3.amazonaws.com/0/239266/cba67e06-10f4-c22e-b649-0b34704ba872.png)

Test Accuracy 94%

kerasが公開しているInceptionV3 imagenet訓練済みモデルでのトレーニングと比べると、こちらの方が精度が高く出た。
https://qiita.com/Ryota7101/items/f1103ba4969113e65adf

#チェックポイントをsavedmodelへ変換
訓練したモデルをGCPへデプロイしたいので、savedmodelへ変換し、デプロイ

こちらを参考
https://stackoverflow.com/questions/44329185/convert-a-graph-proto-pb-pbtxt-to-a-savedmodel-for-use-in-tensorflow-serving-o

・![スクリーンショット 2018-02-25 19.23.30.png](https://qiita-image-store.s3.amazonaws.com/0/239266/ae7cbb48-149e-4c68-79b2-11f2ae982667.png)

inputのnode名が間違っていた為、デプロイ出来ず
微調整時のinput nodeの調べ方がわからないので、ここで中止

pbファイルをGCPにデプロイ、予測までを行う簡単な方法があればご教授ください・・・