如何在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
,其中F1
和F2
为特征,T
为目标。然后我自然地调用make_csv_dataset(..., label_name='T')
来生成我的数据集。但是,我如何转换目标,以便所有数据处理都整齐地包装在Dense
层中?
TensorFlow的tf.data
团队是否忽略了标签通常是分类的,因此需要转换的事实?
编辑我希望避免使用pandas,因为它是不可伸缩的,因此我强调使用"原生"。tf.data
的工具(例如,make_csv_dataset()
或其他)。
在这种情况下,您有两个选项:
- 转换为类标签索引,然后使用稀疏分类交叉熵
- 将类标签索引转换为一个热编码-在这种情况下,您必须使用分类交叉熵损失
编辑:注意,该函数可以对类
进行编码。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)