0

如何在 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忽略了标签通常是分类的,因此需要转换的事实?

编辑:我想避免使用熊猫,因为它不可扩展,因此我强调tf.data(例如,make_csv_dataset()或其他)的“本机”工具。

4

1 回答 1

0

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

  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)
于 2021-08-03T07:54:09.477 回答