私は TFX (TensorFlow Extended) を初めて使用し、TensorFlow ポータルのサンプルチュートリアルを実行して、データセットに適用する方法をもう少し理解しました。
私のシナリオでは、1 つのラベルを予測する代わりに、当面の問題で 2 つの出力 (カテゴリ 1、カテゴリ 2) を予測する必要があります。
純粋な TensorFlow Keras Functional API を使用してこれを実行しましたが、正常に動作しますが、TFX パイプラインに適合できるかどうかを確認しています。
エラーが発生する場所は、パイプラインのトレーナー段階であり、エラーがスローされる場所は_input_fnにあります。指定されたデータを (機能、ラベル) テンソル ペアに正しく分割していないためだと思われますパイプライン。
シナリオ:
入力データの各行は、[Col1、Col2、Col3、ClassificationA、ClassificationB] の形式になります。
ClassificationA と ClassificationB は、Keras Functional Model を使用して予測しようとしているカテゴリ ラベルです。
keras 機能モデルの出力レイヤーは以下のようになります。ここでは、1 つの高密度レイヤーに結合された 2 つの出力があります (注: 最後に追加された _xf は、クラスを int 表現にエンコードしたことを示すためのものです)。
output_1 = tf.keras.layers.Dense( TargetA_Class、activation='sigmoid'、name = 'ClassificationA_xf')(密)
output_2 = tf.keras.layers.Dense(TargetB_Class, activation='sigmoid', name = 'ClassificationB_xf')(密)
モデル = tf.keras.Model(入力 = 入力、出力 = [出力_1、出力_2])
トレーナー モジュール ファイルでは、モジュール ファイルの先頭に必要なパッケージをインポートしました >
import tensorflow_transform as tft
from tfx.components.tuner.component import TunerFnResult
import tensorflow as tf
from typing import List, Text
from tfx.components.trainer.executor import TrainerFnArgs
from tfx.components.trainer.fn_args_utils import DataAccessor, FnArgs
from tfx_bsl.tfxio import dataset_options
トレーナー モジュール ファイルの現在のinput_fnは次のようになります (チュートリアルに従ってください)。
def _input_fn(file_pattern: List[Text],
data_accessor: DataAccessor,
tf_transform_output: tft.TFTransformOutput,
batch_size: int = 200) -> tf.data.Dataset:
"""Helper function that Generates features and label dataset for tuning/training.
Args:
file_pattern: List of paths or patterns of input tfrecord files.
data_accessor: DataAccessor for converting input to RecordBatch.
tf_transform_output: A TFTransformOutput.
batch_size: representing the number of consecutive elements of returned
dataset to combine in a single batch
Returns:
A dataset that contains (features, indices) tuple where features is a
dictionary of Tensors, and indices is a single Tensor of label indices.
"""
return data_accessor.tf_dataset_factory(
file_pattern,
dataset_options.TensorFlowDatasetOptions(
batch_size=batch_size,
#label_key=[_transformed_name(x) for x in _CATEGORICAL_LABEL_KEYS]),
label_key=_transformed_name(_CATEGORICAL_LABEL_KEYS[0]), _transformed_name(_CATEGORICAL_LABEL_KEYS[1])),
tf_transform_output.transformed_metadata.schema)
トレーナー コンポーネントを実行すると、次のエラーが表示されます。
label_key=_transformed_name(_CATEGORICAL_LABEL_KEYS[0]),transformed_name(_CATEGORICAL_LABEL_KEYS 1 )),
^ SyntaxError: 位置引数がキーワード引数に続く
また、エラーが発生する label_key=[_transformed_name(x) for x in _CATEGORICAL_LABEL_KEYS])も試しました。
ただし、単一のラベル キーlabel_key=transformed_name(_CATEGORICAL_LABEL_KEYS[0])を渡すだけで問題なく動作します。
参考までに - _CATEGORICAL_LABEL_KEYS は、予測しようとしている 2 つの出力 (ClassificationA、ClassificationB) の名前を含むリストに他なりません。
変換された_name は、変換されたデータの更新された名前/キーを返す関数に他なりません。
def transformed_name(key):
return key + '_xf'
質問:
私が見ることができることから、dataset_options.TensorFlowDatasetOptions の label_key 引数は 、ラベルの単一の文字列/名前のみを受け入れることができます。つまり、複数のラベルを持つデータセットを出力できない可能性があります。
_input_fnによって返されるデータセットを取得して 2 つの出力ラベルを返すように_input_fnを変更する方法はありますか? したがって、返されるテンソルは次のようになります。
Feature_Tensor: {Col1_xf: Col1_transformedfeature_values、Col2_xf: Col2_transformedfeature_values、Col3_xf: Col3_transformedfeature_values}
Label_Tensor: {ClassificationA_xf: ClassA_encodedlabels, ClassificationB_xf: ClassB_encodedlabels}
tfx のより広いコミュニティからのアドバイスをいただければ幸いです。