如何处理TensorFlow中的分类标签?



如何在TensorFlow中转换(例如,one-hot编码,索引,分类,嵌入等)标签?tf.feature_column是功能的首选方式,但是标签(即目标)呢?它们也可能经常需要转换,并作为整个Keras管道中的一个层来处理。问题是tf.feature_column只作用于特征,而不是标签。

以CSV

为例
F1     F2    T 
3.7    2.0   A
1.7    3.5   B
6.0    6.6   A
0.7    3.2   A

,其中F1F2为特征,T为目标。然后我自然地调用make_csv_dataset(..., label_name='T')来生成我的数据集。但是,我如何转换目标,以便所有数据处理都整齐地包装在Dense层中?

TensorFlow的tf.data团队是否忽略了标签通常是分类的,因此需要转换的事实?

编辑我希望避免使用pandas,因为它是不可伸缩的,因此我强调使用"原生"。tf.data的工具(例如,make_csv_dataset()或其他)。

在这种情况下,您有两个选项:

  1. 转换为类标签索引,然后使用稀疏分类交叉熵
  2. 将类标签索引转换为一个热编码-在这种情况下,您必须使用分类交叉熵损失

编辑:注意,该函数可以对类

进行编码。
In [14]: @tf.function
...: def map_labels(feature, target):
...:     return feature, tf.one_hot(target, 2) # number of classes = 2

如果你正在使用tf dataset api

,你可以这样添加数据集
In [1]: import pandas as pd
In [2]: import tensorflow as tf
2021-08-03 15:58:01.546181: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
In [3]: df = pd.DataFrame({
...:     'F1': [20 ,30 ,40 ,60],
...:     'F2': [10, 50, 300, 300],
...:     'label': ['A', 'B', 'A', 'B']
...:     })
In [8]: df['label'] = df['label'].replace({'A': 0, 'B': 1})
In [12]: dataset = tf.data.Dataset.from_tensor_slices((df.iloc[:, :-1], df.iloc[:, -1]))
In [13]: dataset = dataset.shuffle(len(dataset)).map(map_labels).batch(20)

相关内容

  • 没有找到相关文章

最新更新