Path: blob/master/site/ja/tfx/tutorials/transform/simple.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
TensorFlow Transform を使用したデータの前処理
TensorFlow Extended (TFX) の特徴エンジニアリングコンポーネント
注:この例は、Jupyter スタイルのノートブックで今すぐ実行できます。セットアップは必要ありません。「Google Colab で実行」をクリックするだけです
この Colab ノートブックの例では、TensorFlow Transform(tf.Transform
)を使用して、簡単にデータを前処理する方法を紹介します。ここではモデルのトレーニングと本番環境での推論のサービングの両方に同じコードを使用します。
TensorFlow Transform は、トレーニングデータセットのフルパスを必要とする特徴の作成など、TensorFlow の入力データを前処理するためのライブラリです。たとえば、TensorFlow Transform を使用すると、次のことができます。
平均と標準偏差を使用して入力値を正規化する
すべての入力値に対して語彙を生成することにより、文字列を整数に変換する
観測されたデータ分布に基づいて、浮動小数点数をバケットに割り当てることにより、浮動小数点数を整数に変換する
TensorFlow には、単一のサンプルまたはサンプルのバッチに対する操作のサポートが組み込まれています。tf.Transform
は、これらの機能を拡張して、トレーニングデータセット全体のフルパスをサポートします。
The output of tf.Transform
is exported as a TensorFlow graph which you can use for both training and serving. Using the same graph for both training and serving can prevent skew, since the same transformations are applied in both stages.
Pip のアップグレード
ローカルで実行する場合にシステム Pip をアップグレードしないようにするには、Colab で実行していることを確認してください。もちろん、ローカルシステムは個別にアップグレードできます。
TensorFlow Transform のインストール
インポート
データ: ダミーデータを作成する
簡単な例として、いくつかの簡単なダミーデータを作成します。
raw_data
は前処理する最初の生データですraw_data_metadata
にはraw_data
の各列の型を示すスキーマが含まれています。この例では非常に簡単です。
変換:前処理関数を作成する
前処理関数は、tf.Transform の最も重要な概念です。前処理関数では、データセットの変換が実際に行われます。テンソルのディクショナリーを受け入れて返します。ここで、テンソルは Tensor
または SparseTensor
を意味します。通常、前処理関数の中心となる API 呼び出しには 2 つの主要なグループがあります。
TensorFlow 演算子: テンソルを受け入れて返す関数。通常は TensorFlow 演算子を意味します。これらは、生データを一度に 1 つの特徴ベクトルで変換されたデータに変換するグラフに TensorFlow 演算子を追加します。これらは、トレーニングとサービングの両方で、すべてのサンプルで実行されます。
Tensorflow Transform アナライザー/マッパー: tf.Transform によって提供されるアナライザー/マッパーのいずれか。これらもテンソルを受け入れて返し、通常は Tensorflow 演算子と Beam 計算の組み合わせを含みますが、TensorFlow 演算子とは異なり、分析中はビームパイプラインでのみ実行され、トレーニングデータセット全体を通じた処理が必要になります。Beam 計算は(トレーニング前、分析中に)1 回だけ実行され、通常はトレーニングデータセット全体を処理します。
tf.constant
テンソルが作成され、グラフに追加されます。たとえば、tft.min
は、トレーニングデータセットのテンソルの最小値を計算します。
注意: 前処理関数をサービング推論に適用する場合、トレーニング中にアナライザーにより作成された定数は変更されません。データに傾向または季節性の要素がある場合は、それに応じて計画します。
Note: The preprocessing_fn
is not directly callable. This means that calling preprocessing_fn(raw_data)
will not work. Instead, it must be passed to the Transform Beam API as shown in the following cells.
構文
これで、すべてをまとめて Apache Beam を使用して実行する準備がほぼ整いました。
Apache Beam は、特別な構文を使用して変換を定義および呼び出します。たとえば、次の行をご覧ください。
メソッド to_this_call
が呼び出され、pass_this
というオブジェクトが渡されます。この演算は、スタックトレースで name this step
と呼ばれます。to_this_call
の呼び出しの結果は、result
に返されます。 頻繁にパイプラインのステージは次のようにチェーンされます。
そして、新しいパイプラインで始まったので、以下のように続行します。
すべてを提供する
これで、データを変換する準備が整いました。ダイレクトランナーで Apache Beam を使用し、次の 3 つの入力を提供します。
raw_data
- 上で作成した生の入力データraw_data_metadata
- 生データのスキーマpreprocessing_fn
- 変換を行うために作成した関数
答えは正しいでしょうか?
以前は、これを行うために tf.Transform
を使用しました。
x_centered -
[1, 2, 3]
の入力では、x の平均は 2 であり、x からその平均を引いて x 値を 0 に設定します。この場合、正しい結果は[-1.0, 0.0, 1.0]
になります。y_normalized - y 値を 0 から 1 の間でスケーリングしています。入力は
[1, 2, 3]
であったため、正しい結果は[0.0, 0.5, 1.0]
になります。s_integerized - 文字列を語彙のインデックスにマップしています。語彙には 2 つの単語(「hello」と「world」)しかありませんでした。したがって、
["hello", "world", "hello"]
を入力する場合、正しい結果は[0, 1, 0]
になります。このデータでは「hello」が最も頻繁に発生するため、「hello」が語彙の最初のエントリになります。x_centered_times_y_normalized - 乗算を使用して
x_centered
とy_normalized
を掛け合わせることにより、新しい機能を作成しています。これにより、元の値ではなく結果が乗算され、[-0.0, 0.0, 1.0]
の新しい結果が正しいことに注意してください。
結果の transform_fn
を使用する
transform_fn/
ディレクトリには、グラフに組み込まれたすべての定数 tensorflow-transform の分析結果を実装する tf.saved_model
が含まれています。
これを tf.saved_model.load
で直接ロードすることは可能ですが、これは簡単ではありません。
より良いアプローチは、tft.TFTransformOutput
を使用してロードすることです。 TFTransformOutput.transform_features_layer
メソッドは、変換を適用するために使用できる tft.TransformFeaturesLayer
オブジェクトを返します。
この tft.TransformFeaturesLayer
は、バッチ機能のディクショナリを想定しています。したがって、raw_data
に List[Dict[str, Any]]
から Dict[str, tf.Tensor]
を作成します。
tft.TransformFeaturesLayer
は単独で使用できます。
エクスポート
より一般的なユースケースでは、tf.Transform
を使用してトレーニングおよび評価データセットに変換を適用します(例については、次のチュートリアルを参照してください)。次に、トレーニング後、モデルをエクスポートする前に、tft.TransformFeaturesLayer
を最初のレイヤーとして添付して、tf.saved_model
の一部としてエクスポートできるようにします。以下で、具体的な例を説明します。
トレーニングモデルの例
以下は次のようなモデルです。
変換済みのバッチを取り込み、
すべてを一緒にまとめて、シンプルな
(batch, features)
行列にし、いくつかの Dense レイヤーで実行し、そして
10 個の線形出力を生成する。
実際のユースケースでは、s_integerized
機能に one-hot を適用します。
このモデルは、tf.Transform
によって変換されたデータセットでトレーニングできます。
モデルをトレーニングしたと想像してください。
このモデルは、変換された入力で実行されます
エクスポートラッパーの例
上記のモデルをトレーニングし、それをエクスポートしたいとします。
エクスポートされたモデルに変換関数を含める必要があります。
この結合されたモデルは生データで機能し、トレーニングされたモデルを直接呼び出すのとまったく同じ結果を生成します。
この export_model
には tft.TransformFeaturesLayer
が含まれており、完全に自己完結型です。保存して別の環境に復元しても、まったく同じ結果が得られます。