初めに
この記事は 2018/02/03 に開催の「機械学習 名古屋 第14回勉強会 【CIFAR-10を使ったハンズオン】」のための解説ページです。
CIFAR-10 とは?
-
CIFAR-10 and CIFAR-100 datasets
- 画像分類(教師あり学習)用データセット:
- 画像サイズ 32x32
- 10クラスの画像がそれぞれ6000枚、計60000枚の画像
- そのうち50000枚が学習データ、10000枚がテストデータ
- クラスは airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck
- 今回はこのデータセットを使って、TensorFlow と TensorBoard の使い方と、CNN(畳み込みニューラルネットワーク)の基本を押さえよう!というテーマ。
ハンズオン環境
以下の環境を前提とします:
- Python 2.7.x / 3.x (3.5 以上を推奨)
- TensorFlow v1.3.0 / v1.4.0 / v1.4.1
- それ以前のバージョンでもおそらく動作しますが、できる限り最新のTensorFlowをご用意ください。
- つい先日 v1.5.0 も出ましたが、こちらもおそらく動作します(動作未確認)
- TensorBoard v0.1.8 / 0.4.0rc1 以上
- それ以前のバージョンでもおそらく動作しますが、できる限り最新のTensorBoardをご用意ください。
- つい先日 v1.5.0 も出ましたが、こちらもおそらく動作します(動作未確認)
- numpy v0.11.x 以上
- Jupyter Notebook (オプション)
お使いのPC環境にて、そのままインストール、もしくは Docker イメージ(後述)を pull するなどしてご準備ください。(Python や TensorFlow その他のパッケージのインストール方法は割愛します)
Docker イメージ
これらの環境構築済の Docker イメージ を用意しました(前回 と同じものです)。
Docker がインストールされていて利用できる(したい)ときは、docker pull antimon2/mln201711
してご利用ください。
ハンズオン0:前準備
今回のハンズオンで使用する各種スクリプト・Jupyter notebook ファイル等をまとめた 勉強会用Gitリポジトリ を用意してあります。
以下のコマンドに従って、適当なディレクトリ(フォルダ)に clone してください1:
git clone https://github.com/antimon2/MLN_201802
clone したリポジトリのディレクトリに cd すると、そこに docker run ~
する各種スクリプトを用意してあるので、Linux/macOS の場合は ~.sh
を、Windows の場合は ~.bat
をそれぞれ実行すればOK。カレントディレクトリ配下のディレクトリをマウントして Dockerコンテナ を実行するようになっています。Dokcerイメージを利用しない場合のコマンドも、この記事で随時解説していきます。
まずは、Jupyter notebook を起動します。
Docker イメージを利用する場合、以下のコマンドを実行してください(Linux/macOS の場合):
./docker.run.jupyter.sh
(Windows の場合)2:
.\docker.run.jupyter.bat
Docker イメージを利用せず、PCに構築した環境に Jupyter がインストールされている場合、以下のコマンドを実行してください:
jupyter notebook --notebook-dir notebooks
その後ブラウザで http://localhost:8888
にアクセスすると3、Jupyter notebook の画面が現れます。
以降、Jupyter notebook を利用する前提で進めていきます4。
※Jupyter 起動コマンドを実行したターミナル(コマンドプロンプト)は閉じないでください!
ハンズオン1: 学習 / 評価
この節は、公式チュートリアルの Convolutional Neural Networks を参考に、CIFAR-10 のデータセット、CNN、TensorFlow と TensorBoard にとにかく触れてみよう、という内容です。
1-1. スクリプトの実行
Jupyter notebook のファイル一覧に表示されている CIFAR10_Train_Validate.ipynb を開いて、各セルを上から順に実行してください。
一部だけ解説します。
-
Download and Extract (if not yet)
- CIFAR-10 データセットをネットワークからダウンロード・展開します。
ダウンロードはネットワークの速度にもよりますが、数十秒~数分かかります。 - ダウンロード済(所定の場所に
cifar-10-binary.tar.gz
ファイルが存在する)ならば再ダウンロードは行われません。
回線速度やデータ量が気になる方は、ダウンロード済のデータセット(上記.tar.gz
ファイル)を用意しておくのでそれを所定の位置にコピーしてご利用ください。
- CIFAR-10 データセットをネットワークからダウンロード・展開します。
-
Input Data (Definition)
- TensorFlow のマルチスレッドキュー機能を利用して CIFAR-10 のデータ(画像とラベル)を読み込む記述です。
-
train_inputs()
関数は学習用のデータ読込、test_inputs()
関数はテスト/検証用のデータ読込処理です。
両関数内の「どのファイルから読み込むか」や「読み込んだ画像をどう処理しているか」の違いを確認してください。
-
For Trainings
- 学習(および評価)の設定、そして学習実行します。
-
inference()
関数がCNNの構築、train()
関数はそれを利用した学習用グラフの構築、validate()
関数は評価用グラフの構築です。 - 随所にある
tf.summary.xxx(~)
やsummary.value.add(~)
といった記述は、TensorBoard 用の「可視化」のための記述です。何をどういうタイミングで指定しているか見てみましょう。
1-2. TensorBoard 起動・確認
先ほど Jupyter 起動コマンドを打ち込んだのとは別のターミナル(コマンドプロンプト)をもう1枚立ち上げてください。
Docker イメージを利用している場合は、そこに以下のコマンドを実行してください(Linux/macOS の場合):
./docker.run.tensorboard.sh
Docker イメージを利用していない場合は、以下の要領でコマンドを実行してください5:
tensorboard --logdir notebooks/summary
その後、ブラウザで http://localhost:6006
を開いてください。
以下のようなページが表示されたら成功です:
- TensorBoard は、上記の学習実行中に開いてもOKです。
学習経過が随時更新されていくのが見られます。 - 一通り操作・閲覧が終わっても、ブラウザのページも開いたままで、TensorBoard も終了しなくてもOKです。
終了する場合は、TensorBoard を起動したターミナル上で Ctrl+C キーを押せばOK。
※TensorBoard を起動したターミナル(コマンドプロンプト)も閉じないでください!
ハンズオン2: 推測(画像分類)
この節は、CIFAR-10 の学習結果を利用して、実際の入力画像を推測(分類)してみます。
2-1. スクリプトの実行
Jupyter notebook のファイル一覧に表示されている CIFAR10_Predict.ipynb を開いて、各セルを上から順に実行してください。
一部だけ解説します。
-
Input Data (Definition)
- 画像を読み込み、推測して結果を出力する一連の動きを記述しています。
- 読み込む画像ファイルは .jpg を想定しています。.png を読み込みたい場合は、一部修正が必要です。
-
inference()
関数の中身は、CIFAR10_Train_Validate.ipynb に記述のものとほぼ同内容です(_activation_summary(~)
の記述のみコメントアウトしてあります)。- もし CIFAR10_Train_Validate.ipynb 内の
inference()
関数を変更したら、CIFAR10_Predict.ipynb 内のinference()
関数も同内容に修正する必要があります。
- もし CIFAR10_Train_Validate.ipynb 内の
-
classify()
関数に、画像ファイルへのパスを渡すと、そのファイルを読み込んで、学習結果のモデルを利用して推測し、結果を出力します。
出力結果は以下のような形式です:- "INFO:tensorflow:Restoring parameters from ./train/model.ckpt-xxx"(学習結果(または途中経過)の何ステップ目のモデルを利用したかの情報)
- "Prediction: ~"(推測結果で最上位のクラス(例:cat))
- 各クラスの確信度(指数表記)
- サンプルとしてネットで見付けたフリー素材3点を用意していますが、お手元に画像を用意してそれを同様に分類してみると良いでしょう。
- ※この notebook も、学習中に開いて実行してもOKです。100ステップごとに記録されるモデル(チェックポイント)ごとに推測結果がどう変化するかを見ることができます。
2-2. TensorBoard (起動・)確認
先ほど TensorBoard を起動したままの場合はそのまま、一度終了していたら、同じコマンドを実行して再度 TensorBoard を起動してください(コマンド省略)。
その後、ブラウザで http://localhost:6006
を開いてください。
以下のようなページが表示されたら成功です:
Q&A
想定される(もしくは実際にあった)問題とそれに対する回答を記しておきます。
- Q. Jupyter を起動した(つもり)が、ブラウザで
http://localhost:8888
を開いても何も表示されない。- A. いくつか理由が考えられます:
- A1. コマンドを実行した後、ターミナル(コマンドプロンプト等)を閉じていませんか?
Jupyter を動作したままにしておくために、ターミナル(コマンドプロンプト)を開いたままにしておいてください(最小化しておくのはOK)。 - A2. Docker Toolbox を利用している場合、localhost の代わりに Docker Machine に割り当てられたIPアドレスを指定する必要が(たぶん)あります(例:
http://192.168.99.100:8888/
) - A3. すでに別のアプリケーション等でポート 8888 が使用されている場合、エラーとなります。その際は、スクリプトファイルを修正するなどしてポート番号を変更してください。例えば
docker.run.jupyter.sh
で8080
番ポートを利用するには-p 8888:8888
となっている箇所を-p 8080:8888
とすればOKです、その後docker.run.jupyter.sh
実行→http://localhost:8080
にアクセスすればOK。
- A1. コマンドを実行した後、ターミナル(コマンドプロンプト等)を閉じていませんか?
- A. いくつか理由が考えられます:
- Q. TensorBoard を起動した(つもり)が、ブラウザで
http://localhost:6006
を開いても何も表示されない。- A. いくつか理由が考えられます。
まず、Jupyter 起動時と同様「A1. ターミナルは閉じていないか」「A2. Docker Toolbox 利用していないか」「A3. 他のアプリとポート番号かぶっていないか」をチェックしてください。- A4. 最初は起動して表示できたのに、2回目に起動に失敗する場合。前回起動した TensorBoard が正常に終了していない可能性があります。
プロセスを確認して、以前起動した TensorBoard が起動したままになっていたら、適切に終了 or 強制終了してください。
Docker イメージを利用している場合は、docker ps
で稼働しているコンテナを確認して、docker kill 《終了したいコンテナのID》
で強制終了できます。
- A4. 最初は起動して表示できたのに、2回目に起動に失敗する場合。前回起動した TensorBoard が正常に終了していない可能性があります。
- A. いくつか理由が考えられます。
-
git が利用できない場合、GitHub のリポジトリURL https://github.com/antimon2/MLN_201802 にブラウザでアクセスして、「Clone or download」→「Download ZIP」 で
.zip
ファイルをダウンロードして展開してもOKです。 ↩ -
Windows 用のコマンドは、基本的に Linux/macOS 用のコマンドの最後を
.bat
に変更したものが対応しています。以降は Windows 用のコマンドを省きます。 ↩ -
Docker イメージを利用せず
jupyter
コマンドを実行した場合には、自動的にデフォルトブラウザが起動してhttp://localhost:8888
を開いてくれる場合があります。 ↩ -
Jupyter を利用しない(できない)場合、例えば各
.ipynb
ファイルごとに、各セルをまとめて1つの.py
ファイルにして、それを実行すればおそらく動作すると思われます。また iPython や標準の REPL を起動して、各セルを一つずつコピペして実行しても良いでしょう。 ↩ -
Docker イメージを利用せず独自の環境でハンズオンを進めている場合、logdir が別のディレクトリになる場合があります。適宜確認して正しいディレクトリを指定するようにしてください。 ↩