1日目はなにしたの?
データのアルゴリズムとロジスティクスの話をまとめて、
Resnetのロジスティクスを読み解き、データセットの準備の部分まで到達した。
ensekitt.hatenablog.com
2日目はなにしたの?
Resnetの学習部分のロジスティクスを読み解き、Resnetにデータを渡して学習するまでに何をしているのか?を知った。
ensekitt.hatenablog.com
つまりなにしたの?
Resnetのロジスティクスを支えるTensorFlow.Estimatorのドキュメントを読んで、保存してある画像に対して予測するコードを書いた。
実装するにあたって読んだEstimatorのオレオレ日本語訳も載せます。
今回実装したコードの実行方法
python cifar10_download_and_extract.py python cifar10_main.py python cifar10_try.py --image=/path/of/image #←今回のコード
主にinput_fnを改造して、引数で入力した画像(32x32x3になっているものとする)を読み込んで
1枚だけど、tf.contrib.Data.Dataset()に入れて、One_shot_iteratorに変換して画像のtensorを返すようにした。
あとは、tf.Estimatorのpredictを走らせて、識別結果を標準出力に提示する。
実装するにあたって読んだTensorFlow.Estimatorのオレオレ解釈訳
tf.estimatorにはtrain, evaluate, predictとexport_savedmodelがある。
定義するときには、モデルを定義した関数(model_fn)が必要。
train
trainを実施するときには、入力関数(input_fn)が必要
input_fnは(features, labels)のタプルを返すこと。
featuresはTensor、Tensorの文字列、Tensorの文字列の辞書
labelsはラベルがついたTensor、Tensor辞書
それ以外に、hooks, steps, max_stepsの定義ができる
hooksはSessionRunHookサブクラスインスタンスのリストが定義できる。
hooksの条件に合致した場合は、Callbackが発生する
Callbackはインスタンス作成時に定義される
Stepsは学習を行うStep数を定義できる
Noneの場合は、OutOfRangeかStopIterationのErrorが発生するまで学習し続ける
Stepsを定義してもOutOfRangeかStopIterationのErrorが発生したら学習は止まる
実際はtrainを呼び出す回数*Step数が学習を行うStep数になる
このようなインクリメンタル(何度も呼び出すよう)な実行をしたくない場合はmax_stepsを定義してstepsはNoneにする必要がある
逆にStepsを定義したらmax_stepsはNoneにする必要がある
max_stepsは学習を行う回数の最大値を定義できる
Noneの場合は、OutOfRangeかStopIterationのErrorが発生するまで学習し続ける
max_stepsを定義してもOutOfRangeかStopIterationのErrorが発生したら学習は止まる
max_stepsを定義したらstepsは必ずNoneでなければならない
学習を呼び出す回数によらずmax_stepsの値で定義された回数しか学習が行われない
max_stepsを100に設定したら、学習を2回呼び出してもエラーが無ければ2回目は何もしない
evaluate
evaluateを実施するときには、入力関数(input_fn)が必要
evaluateはステップ毎にinput_fnを呼び出してバッチ特徴量を取得する。Step数分実行して評価を行うか、input_fnが入力限界などのエラーを返すまで実行される。
input_fnは(features, labels)のタブルを返すこと。
featuresはTensor、Tensorの文字列、Tensorの文字列の辞書
labelsはラベルがついたTensor、Tensor辞書
それ以外にsteps, hooks, checkpoint_path, nameが定義できる
Stepsは学習を行うStep数を定義できる
Noneの場合は、OutOfRangeかStopIterationのErrorが発生するまで学習し続ける
Stepsを定義してもOutOfRangeかStopIterationのErrorが発生したら学習は止まる
hooksはSessionRunHookサブクラスインスタンスのリストが定義できる
hooksの条件に合致した場合は、Callbackが発生する
Callbackはインスタンス作成時に定義される
checkpoint_pathは評価を行う特定のチェックポイントのパスが定義できる
Noneの場合、model_dirの最新のチェックポイントが使用される
Nameは評価そのものに名前を定義できる
対象のデータセットによって名前を変えることで別々のディレクトリに結果が格納され、TensorBoardで利用できる
predict
predictは与えられた特徴量に対して予測(predictions tensor)を返す
predictを実施するときには、入力関数(input_fn)が必要
input_fnは辞書に登録された文字列名で定義されているTensorかSparseTensorの特徴量を返す
トレーニング向けなどでタプルを返す関数の場合はタプルの1つ目の要素が予測に用いられる
input_fnがOutOfRangeかStopIteraionのErrorが発生するまで予測をつづける
それ以外にpredict_keys, hooks, checkpoint_pathが定義できる
predict_keysは文字列のリストで予測するキーの名前を定義できる
EstimatorSpec.predictionsが辞書型のときに用いられる
predict_keysが定義されている場合、予測は辞書によってフィルタリングされた結果を返す
Noneの場合はすべての結果を返す
hooksはSessionRunHookサブクラスインスタンスのリストが定義できる
hooksの条件に合致した場合は、Callbackが発生する
Callbackはインスタンス作成時に定義される
checkpoint_pathは予測を行う特定のチェックポイントのパスが定義できる
Noneの場合、model_dirの最新のチェックポイントが使用される
この他にモデルをExportするための関数が用意されている。*2
https://www.tensorflow.org/api_docs/python/tf/estimator/Estimator
雑感
正直、訳すの意味ないと思ってたけど、自分なりに動かしながら訳を考えて文字に起こしておくと、後で訳文を読めば実装した時のことを思い出すし、やはり解釈も早いし良いことばかりだった。
僕の母国語は日本語だったし、英語は読む頻度が上がっていても日本語ほどは得意じゃないってことを痛感した。
*1:Photo by unsplash.com
*2:今回自分が使わないから訳さなかった。