web-dev-qa-db-ja.com

tensorflowtf-transformを使用したデータの正規化

Tensorflowを使用して、自分のデータセットでニューラルネットワークの予測を行っています。私が最初に行ったのは、コンピューター内の小さなデータセットで機能するモデルでした。この後、より大きなデータセットでGoogle Cloud ML-Engineを使用して、ML-Engineで列車と予測を実現するために、コードを少し変更しました。

パンダデータフレームの機能を正規化していますが、これによりスキューが発生し、予測結果が不十分になります。

私が本当に望んでいるのは、ライブラリtf-transformを使用してグラフのデータを正規化することです。これを行うには、関数preprocessing_fnを作成し、 'tft.scale_to_0_1'を使用します。 https://github.com/tensorflow/transform/blob/master/getting_started.md

私が見つけた主な問題は、予測を行おうとしているときです。インターネットを探していますが、トレーニングでデータが正規化されているエクスポートされたモデルの例が見つかりません。私が見つけたすべての例で、データはどこにも正規化されていません。

私が知りたいのはトレーニングでデータを正規化し、予測を行うために新しいデータを含む新しいインスタンスを送信した場合、このデータはどのように正規化されますか?

¿多分Tensorflowデータパイプラインにありますか?正規化を行うための変数はどこかに保存されていますか?

要約すると、モデルの入力を正規化して、新しいインスタンスも標準化される方法を探しています。

6
Marc

まず第一に、これには実際にはtf.transformは必要ありません。あなたがする必要があるのは、training/evalinput_fnとあなたのサービングinput_fnの両方から呼び出す関数を書くことです。

たとえば、データセット全体でPandasを使用して、最小値と最大値を計算したと仮定します。

def add_engineered(features):
  min_x = 22
  max_x = 43
  features['x'] = (features['x'] - min_x) / (max_x - min_x)
  return features

次に、input_fnで、返された機能をadd_engineeredの呼び出しでラップします。

def input_fn():
  features = ...
  label = ...
  return add_engineered(features), label

また、serving_input fnで、返された機能(feature_placeholdersではなく)をadd_engineeredの呼び出しで同様にラップするようにしてください。

def serving_input_fn():
    feature_placeholders = ...
    features = feature_placeholders.copy()
    return tf.estimator.export.ServingInputReceiver(
         add_engineered(features), feature_placeholders)

これで、予測時のJSON入力には、元のスケーリングされていない値のみを含める必要があります。

これは、このアプローチの完全な実例です。

https://github.com/GoogleCloudPlatform/training-data-analyst/blob/master/courses/machine_learning/feateng/taxifare/trainer/model.py#L1

tf.transformは、最小、最大を計算する分析ステップと、TensorFlowグラフにスケーリングを挿入するグラフ変更ステップの2段階のプロセスを提供します。したがって、tf.transformを使用するには、最初にDataflowパイプラインを記述して分析を行い、次にTensorFlowコード内にtf.scale_0_to_1への呼び出しをプラグインする必要があります。これを行う例を次に示します。

https://github.com/GoogleCloudPlatform/cloudml-samples/tree/master/criteo_tft

Add_engineered()アプローチはより単純であり、私が提案するものです。データ分布が時間の経過とともに変化する場合、tf.transformアプローチが必要であるため、パイプライン全体を自動化する必要があります(継続的なトレーニングなど)。

11
Lak