TensorFlow : Guide : Estimators : Estimator (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
更新日時 : 07/14, 03/28/2018
作成日時 : 09/15/2017
* TensorFlow 1.9 でドキュメント構成が変わりましたので調整しました。
* 本ページでは Estimator について説明されていますが、Keras モデルから Estimator を作成する方法が新たに追記されました。既存の Keras モデルを Estimator に変換することが可能です。
* 本ページは、TensorFlow 本家サイトの Programmer’s Guide – Estimators を翻訳した上で
適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、適宜、追加改変している場合もあります。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
このドキュメントは Estimator を紹介します — 高位 TensorFlow API で機械学習プログラミングを大幅に単純化します。Estimator は次のアクションをカプセル化します :
- 訓練
- 評価
- 予想
- サービス提供のためのエクスポート
貴方は私たちが提供する pre-made Estimator を使用しても良いですし貴方自身のカスタム Estimator を書いてもかまいません。総ての Estimator は — pre-made であろうがカスタムであろうが — tf.estimator.Estimator クラスを基底とするクラスです。
Note : TensorFlow はまた tf.contrib.learn.Estimator の deprecated な Estimator クラスも提供しますが、これは使うべきではありません。
Estimator の優位点
Estimator は次の利点を提供します :
- Estimator ベースのモデルをローカルホストまたは分散マルチ・サーバ環境で貴方のモデルを変更することなしに実行できます。更に、Estimator ベースのモデルを CPU, GPU, または TPU で貴方のモデルを再コーディングすることなしに実行できます。
- Estimator はモデル開発者間で実装を共有することを単純化します。
- 高位な直感的なコードで最先端のモデルを開発できます。要するに、低位 TensorFlow API よりも Estimator でモデルを作成する方が一般的にはるかに簡単です。
- Estimator それ自身はは tf.layers の上に構築されていて、これはカスタマイゼーションを単純化します。
- Estimator は貴方のためにグラフを構築します。換言すれば、貴方はグラフを構築しなくて良いです。
- Estimator は安全な分散訓練ループを提供します、これは以下に対してどのように (= how)、そしていつか (= when) を制御します :
- グラフを構築する
- 変数を初期化する
- キューを開始する
- 例外を処理する
- チェックポイント・ファイルを作成して failure からリカバーする
- TensorBorard のために要約を保存する
Estimator でアプリケーションを書くときは、データ入力パイプラインをモデルから分離しなければなりません。この分離は異なるデータセットでの実験を単純化します。
pre-made Estimator
pre-made Estimator は基本 TensorFlow API よりもはるかに高い概念レベルで作業することを可能にします。貴方は計算グラフやセッションを作成することについてもはや心配する必要はありません、何故ならば Estimator が貴方のために総ての “配管” を処理するからです。つまり、pre-made Estimator は グラフ と セッション・オブジェクトを貴方のために作成して管理します。更に、pre-made Estimator は最小限のコード変更を行なうことで異なるモデル・アーキテクチャで貴方に実験することを可能にします。例えば、DNNClassifier は密な、順伝播型ニューラルネットワークを通して分類モデルを訓練する pre-made Estimator クラスです。
pre-made Estimator のプログラムの構造
pre-made Estimator に依存する TensorFlow プログラムは典型的には次の4つのステップから成ります :
- 一つまたはそれ以上のデータセットをインポートする関数を書きます。例えば、貴方は訓練セットをインポートする一つの関数とテストセットをインポートするもう一つの関数を作成するかもしれません。各データセットのインポート関数は2つのオブジェクトを返さなければなりません :
- キーが特徴カラム名で値が相当する特徴データを含むテンソル (または疎なテンソル) である辞書
- 一つまたはそれ以上のラベルを含むテンソル
例えば、次のコードは入力関数の基本的なスケルトンを示します :
def input_fn(dataset): ... # manipulate dataset, extracting feature names and the label return feature_dict, label
完全な詳細のためには Importing Data を見てください。
- 特徴カラムを定義します。各 tf.feature_column は特徴名、その型、そして任意の入力前処理を識別します。例えば、次のスニペットは整数または浮動小数点データを保持する3つの特徴カラムを作成します。最初の2つの特徴カラムは単に特徴名と型を識別します。3つめの特徴カラムはまた、行データをスケールするためにプログラムが起動する lambda を指定します :
# Define three numeric feature columns. population = tf.feature_column.numeric_column('population') crime_rate = tf.feature_column.numeric_column('crime_rate') median_education = tf.feature_column.numeric_column('median_education', normalizer_fn='lambda x: x - global_education_mean')
- 関連する pre-made Estimator をインスタンス化する。例えば、LinearClassifier と命名された pre-made Estimator のサンプル・インスタンス化がここにあります :
# Instantiate an estimator, passing the feature columns. estimator = tf.estimator.Estimator.LinearClassifier( feature_columns=[population, crime_rate, median_education], )
- 訓練、評価、または推論メソッドを呼び出す。例えば、総ての Estimator はモデルを訓練する訓練メソッドを提供します。
# my_training_set is the function created in Step 1 estimator.train(input_fn=my_training_set, steps=2000)
pre-made Estimator の利点
pre-made Estimator は次の利点を提供する、ベストプラクティスを作成します :
- 計算グラフの異なるパートがどこで実行されるべきかを決定し、単一のマシン上かクラスタ上でストラテジーを実装するためのベストプラクティス。
- イベント (要約) 書き出しと普遍的に有用な要約のためのベストプラクティス。
pre-made Estimator を使用しない場合は、先の特徴を貴方自身で実装しなければなりません。
カスタム Estimator
総ての Estimator の中心は — pre-made であれカスタムであれ — そのモデル関数で、これは訓練、評価、そして予想のためのグラフをビルドします。貴方が pre-made Estimator を使用しているときは、他の誰かが既にモデル関数を実装しています。カスタム Estimator に依拠するときは、モデル関数を貴方自身で書かなければなりません。companion document がモデル関数をどのように書くかを説明しています。
推奨されるワークフロー
次のワークフローを推奨します :
- 適切な pre-made Estimator が存在すると仮定して、それを使用して貴方の最初のモデルを構築してその結果をベースラインを規定するのに使用します。
- この pre-made Estimator で貴方のデータの統合性と信頼性を含む、パイプライン全体を構築してテストします。
- 適切な代替の pre-made Estimator が利用可能であるならば、どの pre-made Esitimator が最善の結果を生成するかを決めるために実験を実行します。
- おそらくは、貴方自身のカスタム Estimator を構築することにより貴方のモデルを更に改善します。
Keras モデルから Estimator を作成する
既存の Keras モデルを Estimator に変換することが可能です。そのようにすることは貴方の Keras モデルに、分散訓練のような Estimator の強みにアクセスすることを可能にします。次のサンプル内のように tf.keras.estimator.model_to_estimator を呼び出します :
# Instantiate a Keras inception v3 model. keras_inception_v3 = tf.keras.applications.inception_v3.InceptionV3(weights=None) # Compile model with the optimizer, loss, and metrics you'd like to train with. keras_inception_v3.compile(optimizer=tf.keras.optimizers.SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metric='accuracy') # Create an Estimator from the compiled Keras model. Note the initial model # state of the keras model is preserved in the created Estimator. est_inception_v3 = tf.keras.estimator.model_to_estimator(keras_model=keras_inception_v3) # Treat the derived Estimator as you would with any other Estimator. # First, recover the input name(s) of Keras model, so we can use them as the # feature column name(s) of the Estimator input function: keras_inception_v3.input_names # print out: ['input_1'] # Once we have the input name(s), we can create the input function, for example, # for input(s) in the format of numpy ndarray: train_input_fn = tf.estimator.inputs.numpy_input_fn( x={"input_1": train_data}, y=train_labels, num_epochs=1, shuffle=False) # To train, we call Estimator's train function: est_inception_v3.train(input_fn=train_input_fn, steps=2000)
keras estimator の特徴カラムとラベルの名前は対応するコンパイルされた keras モデルに由来することに注意してください。例えば、上の train_input_fn のための入力キー名は keras_inception_v3.input_names から得られます、そして同様に、予測された出力名も keras_inception_v3.output_names から得られます。
より詳細のためには、tf.keras.estimator.model_to_estimator のための文書を参照してください。
以上