我对TFX (TensorFlow Extended)很陌生,并且已经通过TensorFlow门户网站上的示例教程来了解更多将其应用于我的数据集。
在我的场景中,不是预测单个标签,手头的问题需要我预测2个输出(类别1,类别2)。
我已经使用纯TensorFlow Keras Functional API完成了这个工作,并且工作得很好,但是现在我正在寻找是否可以适合TFX管道。
我得到错误的地方,是在训练器管道的阶段,它抛出错误的地方是在_input_fn,我怀疑这是因为我没有正确地将给定的数据分成(特征,标签)张量对。
场景:
-
每一行输入数据都以[Col1, Col2, Col3, classiationa, ClassificationB]
-
ClassificationA和ClassificationB是我试图使用Keras功能模型预测的分类标签
keras函数模型的输出层如下所示,其中有两个输出连接到单个致密层(注意:_xf附加到末尾只是为了说明我已经将这些类编码为int表示)
output_1 = tf.keras.layers.Dense()TargetA_Class激活=乙状结肠,name = 'ClassificationA_xf')(dense)
output_2 = tf.keras.layers.Dense()TargetB_Class激活=乙状结肠,name = 'ClassificationB_xf')(dense)
model = tf.keras。模型(输入=输入,输出= [output_1, output_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_KEYS1)),
^ SyntaxError:位置参数跟随关键字参数
我也尝试过label_key=[_transformmed_name (x) for x in _CATEGORICAL_LABEL_KEYS])这也给出一个错误。
然而,如果我只是传递一个标签键,label_key= transformmed_name (_CATEGORICAL_LABEL_KEYS[0])
仅供参考- _CATEGORICAL_LABEL_KEYS只是一个列表,其中包含我试图预测的2个输出的名称(ClassificationA, ClassificationB)。
transformmed_name只是一个函数,用于返回已转换数据的更新名称/键:
def transformed_name(key):
return key + '_xf'
问题:
从我所看到的,dataset_options的label_key参数。TensorFlowDatasetOptions只能接受单个字符串/标签名称,这意味着它可能无法输出具有多个标签的数据集。
是否有一种方法,我可以修改_input_fn,以便我可以得到由_input_fn返回的数据集与返回2个输出标签工作?所以返回的张量看起来是这样的
Feature_Tensor: {Col1_xf: col1_transformmedfeature_values, Col2_xf:Col2_transformedfeature_values Col3_xf:Col3_transformedfeature_values}
Label_Tensor: {ClassificationA_xf: ClassA_encodedlabels,ClassificationB_xf: ClassB_encodedlabels}
将感谢来自更广泛的tfx社区的建议!
由于标签键是可选的,也许不是在TensorflowDatasetOptions中指定它,而是您可以使用dataset.map
之后并在从数据集中获取它们后传递两个标签。
还没有测试过,但是像这样:
def _data_augmentation(feature_dict):
features = feature_dict[_transformed_name(x) for x in
_CATEGORICAL_FEATURE_KEYS]]
keys=[_transformed_name(x) for x in _CATEGORICAL_LABEL_KEYS]
return features, keys
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.
"""
dataset = data_accessor.tf_dataset_factory(
file_pattern,
dataset_options.TensorFlowDatasetOptions(
batch_size=batch_size,
tf_transform_output.transformed_metadata.schema)
dataset = dataset.map(_data_augmentation)
return dataset