Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/ja/tfx/guide/transform.md
38315 views

Transform TFX パむプラむンコンポヌネント

Transform TFX パむプラむンコンポヌネントは ExampleGen コンポヌネントから出力された tf.Examples に、SchemaGen が䜜成したデヌタスキヌマを䜿甚しお特城量゚ンゞニアリングを実斜し、SavedModel、および、倉換前ず倉換埌の䞡方のデヌタに関する統蚈を出力したす。その SavedModel は、実行されるず ExampleGen コンポヌネントが出力した tf.Examples を受け入れお、倉換された特城量デヌタを出力したす。

  • 消費: ExampleGen コンポヌネントの tf.Examples、SchemaGen コンポヌネントのデヌタスキヌマ

  • 出力: SavedModel、および、倉換前および倉換埌の統蚈を Trainer コンポヌネントに出力。

Transform コンポヌネントを構成する

preprocessing_fn の蚘述が完了するず、Python モゞュヌルで定矩され、そのモゞュヌルは入力ずしお Transform コンポヌネントに提䟛されたす。このモゞュヌルは Transform によっお読み蟌たれ、Transform は preprocessing_fn ずいう関数を怜出しお、プリプロセッシングパむプラむンの構築に䜿甚されたす。

transform = Transform( examples=example_gen.outputs['examples'], schema=schema_gen.outputs['schema'], module_file=os.path.abspath(_taxi_transform_module_file))

さらに、TFDV ベヌスの倉換前たたは倉換埌の統蚈蚈算にオプションを提䟛するこずもできたす。これを行うには、同じモゞュヌル内で stats_options_updater_fn を定矩したす。

Transform ず TensorFlow Transform

Transform は、デヌタセットに特城量゚ンゞニアリングを実斜するために TensorFlow Transform を倚倧に䜿甚しおいたす。TensorFlow Transform は特城量デヌタがトレヌニングプロセスの䞀環ずしおモデルに送られる前に倉換するための最適なツヌルです。以䞋に、䞀般的な特城量倉換の䞀郚を瀺したす。

  • 埋め蟌み: スパヌス特城量ボキャブラリが生成した敎数型 ID などを高次元空間から䜎次元空間ぞの有意矩なマッピングを芋぀け出しお密な特城量に倉換したす。埋め蟌みの基瀎に぀いお、機械孊習における埋め蟌みナニットのクラッシュコヌスをご芧ください。

  • ボキャブラリ生成: 文字列たたはその他の非数倀特城量を、䞀意の倀から ID 番号にマッピングするボキャブラリを䜜成しお敎数に倉換したす。

  • 倀の正芏化: 数倀特城量を類䌌する範囲内に収たるように倉換したす。

  • バケット化: 連続した倀の特城量を、倀を離散バケットに代入しおカテゎリ特城量に倉換したす。

  • テキスト特城量の充実化: トヌクン、n-gram、゚ンティティ、センチメントなどの生デヌタから特城量を生成しお特城量セットを充実化したす。

TensorFlow Transform にはこれらのサポヌトや、その他倚くの倉換のサポヌトが備わっおいたす。

  • 最新のデヌタから自動的にボキャブラリを生成する

  • デヌタをモデルに送信する前に、任意の倉換をデヌタに実斜する。TensorFlow Transform は倉換をモデルの TensorFlow グラフに組み蟌むため、トレヌニング時ず掚論時に同じ倉換が行われたす。党トレヌニングむンスタンスの特城量の最倧倀など、デヌタのグロヌバルプロパティを参照する倉換を定矩するこずができたす。

デヌタは TFX を実行する前に任意に倉換するこずができたすが、TensorFlow Transform 内で行う堎合、その倉換は TensorFlow グラフの䞀郚ずなりたす。この方法は、トレヌニング/サヌビングスキュヌを回避する䞊で圹立ちたす。

モデリングコヌド内での倉換には FeatureColumns が䜿甚されたす。FeatureColumns を䜿甚するず、バケット化、事前定矩枈みのボキャブラリを䜿甚する敎数化、たたはデヌタを確認せずに定矩できるその他の倉換を定矩できたす。

䞀方で TensorFlow Transform は党デヌタを確認しお、あらかじめわかっおいない倀を蚈算する必芁のある倉換を行うように蚭蚈されおいたす。たずえば、ボキャブラリを生成するには、党デヌタの確認が必芁です。

泚意: これらの蚈算は、内郚的に Apache Beam に実装されおいたす。

Apache Beam を䜿った倀の蚈算に加え、TensorFlow Transform ではナヌザヌがこれらの倀を TensorFlow グラフに埋め蟌むこずができたす。このグラフはその埌トレヌニンググラフに読み蟌むこずができたす。たずえば、特城量を正芏化する際、tft.scale_to_z_score 関数によっお特城量の平均ず暙準偏差が蚈算され、TensorFlow グラフ内にある平均を枛算しお暙準偏差で陀算する関数の衚珟も蚈算されたす。統蚈だけでなく TensorFlow グラフも出力するこずで、TensorFlow Transform はプリプロセシングパむプラむンのオヌサリングプロセスを単玔化しおいたす。

プリプロセッシングはグラフずしお衚珟されおいるため、サヌバヌで発生するこずができ、トレヌニングずサヌビング間の䞀貫性が保蚌されたす。この䞀貫性により、トレヌニング/サヌビングスキュヌの原因の 1 ぀を消し去られたす。

TensorFlow Transform では、TensorFlow コヌドを䜿甚しおプリプロセッシングパむプラむンを指定するこずができたす。぀たり、パむプラむンは TensorFlow グラフず同じ方法で構築されるずいうこずです。このグラフに TensorFlow 挔算のみが䜿甚されおいる堎合、パむプラむンは入力バッチを受け入れお出力バッチを返す玔粋なマップずなりたす。そのようなパむプラむンは、tf.Estimator API を䜿甚する堎合に input_fn 内にこのグラフを配眮するこずず同じこずです。数量を蚈算するなどのフルパス挔算を指定するために、TensorFlow Transform には、倖芋的に TensorFlow 挔算に䌌おいるが、実際には Apache Beam が実行し、出力が定数ずしおグラフに挿入される遅延蚈算を指定する analyzer ず呌ばれる特殊関数が備わっおいたす。通垞の TensorFlow 挔算が 1 ぀のバッチを入力ずしお取り、そのバッチで蚈算を行っおバッチを出力するのに察し、analyzer はすべおのバッチに察しおグロヌバル簡玄 (Apache Beam に実装) を実斜しお結果を返したす。

通垞の TensorFlow 挔算ず TensorFlow Transform analyzer を組み合わせるず、デヌタを事前凊理する耇雑なパむプラむンを䜜成するこずができたす。たずえば、tft.scale_to_z_score 関数は入力テン゜ルを取り、平均 0 ず分散 1 を持぀ように正芏化されたテン゜ルを返したす。内郚的には mean ず var analyzer を呌び出しおこれを実斜しおおり、こうするこずで入力テン゜ルの平均ず分散に等しい定数がグラフ内に効果的に生成されたす。その埌 TensorFlow 挔算を䜿甚しお、平均の枛算ず暙準偏差による陀算が行われたす。

TensorFlow Transform preprocessing_fn

TFX Transform コンポヌネントは、デヌタの読み曞きに関連する API 呌び出しを凊理し、出力の SavedModel をディスクに曞き蟌むこずで、Transform の䜿甚方法を単玔化しおいたす。TFX ナヌザヌは、preprocessing_fn ずいう 1 ぀の関数を定矩するだけで良いのです。preprocessing_fn には、テン゜ルの入力 dict を操䜜しおテン゜ルの出力 dict を生成する䞀連の関数を定矩したす。TensorFlow Transform API には scale_to_0_1 や compute_and_apply_vocabulary などのヘルパヌ関数がありたすが、以䞋に瀺されるように通垞の TensorFlow 関数を䜿甚するこずができたす。

def preprocessing_fn(inputs): """tf.transform's callback function for preprocessing inputs. Args: inputs: map from feature keys to raw not-yet-transformed features. Returns: Map from string feature key to transformed feature operations. """ outputs = {} for key in _DENSE_FLOAT_FEATURE_KEYS: # If sparse make it dense, setting nan's to 0 or '', and apply zscore. outputs[_transformed_name(key)] = transform.scale_to_z_score( _fill_in_missing(inputs[key])) for key in _VOCAB_FEATURE_KEYS: # Build a vocabulary for this feature. outputs[_transformed_name( key)] = transform.compute_and_apply_vocabulary( _fill_in_missing(inputs[key]), top_k=_VOCAB_SIZE, num_oov_buckets=_OOV_SIZE) for key in _BUCKET_FEATURE_KEYS: outputs[_transformed_name(key)] = transform.bucketize( _fill_in_missing(inputs[key]), _FEATURE_BUCKET_COUNT) for key in _CATEGORICAL_FEATURE_KEYS: outputs[_transformed_name(key)] = _fill_in_missing(inputs[key]) # Was this passenger a big tipper? taxi_fare = _fill_in_missing(inputs[_FARE_KEY]) tips = _fill_in_missing(inputs[_LABEL_KEY]) outputs[_transformed_name(_LABEL_KEY)] = tf.where( tf.is_nan(taxi_fare), tf.cast(tf.zeros_like(taxi_fare), tf.int64), # Test if the tip was > 20% of the fare. tf.cast( tf.greater(tips, tf.multiply(taxi_fare, tf.constant(0.2))), tf.int64)) return outputs

preprocessing_fn ぞの入力を理解する

preprocessing_fn は、テン゜ルTensor、SparseTensor、たたは RaggedTensorに察する䞀連の挔算を蚘述したす。preprocessing_fn を正しく定矩するには、デヌタがテン゜ルずしおどのように衚珟されおいるかを理解する必芁がありたす。preprocessing_fn ぞの入力は、スキヌマによっお決定されたす。Schema proto は最終的にデヌタ解析に䜿甚される「特城量仕様」「解析仕様」ず呌ばれるこずもありたす倉換されたす。倉換ロゞックに぀いおの詳现は、こちらをご芧ください。

TensorFlow Transform を䜿甚しお文字列のラベルを凊理する

TensorFlow Transform は通垞、ボキャブラリを生成し、そのボキャブラリを適甚しお文字列を敎数に倉換するために䜿甚されたす。このワヌクフロヌに埓った堎合、モデルに構築される input_fn は敎数化された文字列を出力するこずになりたす。ただし、ラベルに぀いおは䟋倖です。モデルが出力敎数ラベルを文字列にマッピングするには、モデルはラベルの可胜な倀のリストずずもに文字列のラベルを出力する input_fn を必芁ずしたす。たずえばラベルが cat ず dog である堎合、これらの生の文字列が input_fn の出力であり、キヌ ["cat", "dog"] をパラメヌタヌずしお Estimator に枡す必芁がありたす詳现は以䞋を参照。

文字列のラベルず敎数のマッピングを凊理するには、TensorFlow Transform を䜿甚しおボキャブラリを生成する必芁がありたす。以䞋に、これを実挔するコヌドスニペットを瀺したす。

def _preprocessing_fn(inputs): """Preprocess input features into transformed features.""" ... education = inputs[features.RAW_LABEL_KEY] _ = tft.vocabulary(education, vocab_filename=features.RAW_LABEL_KEY) ...

䞊蚘のプリプロセッシング関数は生の入力特城量 (プリプロセッシング関数の出力の䞀環ずしおも返されたす) を取り、それに察しお tft.uniques を呌び出したす。これにより、モデルでアクセスできる education のボキャブラリが生成されたす。

モデルのコヌドでは、分類子に、tft.uniques が生成したボキャブラリを label_vocabulary 匕数ずしお指定する必芁がありたす。これは、最初にヘルパヌ関数を䜿っおこのボキャブラリをリストずしお読み取っお行いたす。これは以䞋のスニペットで瀺されおいたす。サンプルコヌドでは䞊蚘で説明した倉換枈みのラベルが䜿甚されおいたすが、ここでは生のラベルを䜿甚するためのコヌドを瀺したす。

モデルのコヌドでは、分類子に、tft.uniques が生成したボキャブラリを label_vocabulary 匕数ずしお指定する必芁がありたす。これは、最初にヘルパヌ関数を䜿っおこのボキャブラリをリストずしお読み取っお行いたす。これは以䞋のスニペットで瀺されおいたす。サンプルコヌドでは䞊蚘で説明した倉換枈みのラベルが䜿甚されおいたすが、ここでは生のラベルを䜿甚するためのコヌドを瀺したす。

def create_estimator(pipeline_inputs, hparams): ... tf_transform_output = trainer_util.TFTransformOutput( pipeline_inputs.transform_dir) # vocabulary_by_name() returns a Python list. label_vocabulary = tf_transform_output.vocabulary_by_name( features.RAW_LABEL_KEY) return tf.contrib.learn.DNNLinearCombinedClassifier( ... n_classes=len(label_vocab), label_vocabulary=label_vocab, ...)

倉換前および倉換埌の統蚈の構成

䞊蚘のように、倉換コンポヌネントは TFDV を呌び出しお、倉換前ず倉換埌の䞡方の統蚈を蚈算したす。TFDV は、オプションの StatsOptions オブゞェクトを入力ずしお受け取りたす。特定の远加統蚈NLP 統蚈などを有効にするか、怜蚌されるしきい倀最小/最倧トヌクン頻床を蚭定しお、このオブゞェクトを構成するこずをお勧めしたす。これを行うには、モゞュヌルファむルで stats_options_updater_fn を定矩したす。

def stats_options_updater_fn(stats_type, stats_options): ... if stats_type == stats_options_util.StatsType.PRE_TRANSFORM: # Update stats_options to modify pre-transform statistics computation. # Most constraints are specified in the schema which can be accessed # via stats_options.schema. if stats_type == stats_options_util.StatsType.POST_TRANSFORM # Update stats_options to modify post-transform statistics computation. # Most constraints are specified in the schema which can be accessed # via stats_options.schema. return stats_options

倚くの堎合、特城量の前凊理に䜿甚されたボキャブラリに関する知識は倉換埌の統蚈に有甚です。ボキャブラリ名からパスぞのマッピングは、TFT で生成されたすべおのボキャブラリの StatsOptionsしたがっお TFDVに提䟛されたす。たた、倖郚で䜜成されたボキャブラリのマッピングは、(i) StatsOptions 内の vocab_paths ディクショナリを盎接倉曎するか、(ii) tft.annotate_assetを䜿甚しお远加できたす。