多输出分类与TensorFlow扩展(TFX)



我对TFX (TensorFlow Extended)很陌生,并且已经通过TensorFlow门户网站上的示例教程来了解更多将其应用于我的数据集。

在我的场景中,不是预测单个标签,手头的问题需要我预测2个输出(类别1,类别2)。

我已经使用纯TensorFlow Keras Functional API完成了这个工作,并且工作得很好,但是现在我正在寻找是否可以适合TFX管道。

我得到错误的地方,是在训练器管道的阶段,它抛出错误的地方是在_input_fn,我怀疑这是因为我没有正确地将给定的数据分成(特征,标签)张量对。

场景:

  1. 每一行输入数据都以[Col1, Col2, Col3, classiationa, ClassificationB]

  2. 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

相关内容

  • 没有找到相关文章

最新更新