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データパイプラインにありますか?正規化を行うための変数はどこかに保存されていますか?
要約すると、モデルの入力を正規化して、新しいインスタンスも標準化される方法を探しています。
まず第一に、これには実際には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入力には、元のスケーリングされていない値のみを含める必要があります。
これは、このアプローチの完全な実例です。
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アプローチが必要であるため、パイプライン全体を自動化する必要があります(継続的なトレーニングなど)。