【问题标题】:How does one deal with categorical labels in TensorFlow?如何处理 TensorFlow 中的分类标签?
【发布时间】:2021-08-03 07:49:58
【问题描述】:

如何在 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() 或其他)。

【问题讨论】:

  • 您可以使用的标签:tf.keras.utils.to_categorical(y)

标签: tensorflow tensorflow2.0 categorical-data tf.data.dataset


【解决方案1】:

在这种情况下,您有 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)

【讨论】:

  • 不过,这并不能回答您将如何在 labels 上执行此操作的问题。特征列的问题在于它们只作用于特征,而不是标签。我想使用原生的tf.data,而不是可扩展性较差的 pandas 数据框。
  • 我已经调整了我的答案,但你可以轻松地调整我的答案
  • 谢谢...但关键是我想完全避免使用熊猫,因为它不可扩展。 (如果是使用 pandas,所有这些都不是问题,因此我强调仅使用 tf.datamake_csv_dataset()。)
猜你喜欢
  • 2019-03-23
  • 2017-10-25
  • 2017-01-08
  • 2014-04-23
  • 2018-11-13
  • 1970-01-01
  • 2013-12-26
  • 2018-06-11
相关资源
最近更新 更多