将标签编码器实现为 Tensorflow 预处理层
Implementing Label Encoder as a Tensorflow Preprocessing layer
根据我对 SKLearn 的 documentation 的理解,SKLearn 中的 LabelEncoder
编码的值介于 0 和减去 1 的 class 的数量之间(即 n_classes
- 1) .
我想使用类似的东西作为 Tensorflow 预处理操作的一部分,以避免将 SKLearn 用于包。例如,我了解预处理层为 OneHot 编码和分类编码提供了 APIs,如下所示:
tf.keras.layers.CategoryEncoding(
num_tokens=None, output_mode='multi_hot', sparse=False, **kwargs
)
有没有办法通过CategoryEncoding
API中的某些参数来使用LabelEncoder,或者我是否必须使用提供的abstract base class模板定义一个全新的预处理层在 Tensorflow 文档中?
如果是这样,是否有关于如何编写自己的 class 以将 LabelEncoder
用作 Tensorflow 层的参考资料?
IIUC,你只需要稀疏整数标签。所以,也许先尝试一些简单而天真的事情:
classes = ['fish1', 'fish2', 'fish3']
data = ['fish1', 'fish2', 'fish3', 'fish2', 'fish3', 'fish1']
class_indices = dict(zip(classes, range(len(classes))))
labels = list(map(class_indices.get, data))
print(labels)
[0, 1, 2, 1, 2, 0]
或者Tensorflow
,你可以使用StaticHashTable
:
import tensorflow as tf
classes = ['fish1', 'fish2', 'fish3']
data = tf.constant(['fish1', 'fish2', 'fish3', 'fish2', 'fish3', 'fish1'])
table = tf.lookup.StaticHashTable(
tf.lookup.KeyValueTensorInitializer(tf.constant(classes), tf.range(len(classes))),
default_value=-1)
label_encoder = tf.keras.layers.Lambda(lambda x: table.lookup(x))
print(label_encoder(data))
tf.Tensor([0 1 2 1 2 0], shape=(6,), dtype=int32)
根据我对 SKLearn 的 documentation 的理解,SKLearn 中的 LabelEncoder
编码的值介于 0 和减去 1 的 class 的数量之间(即 n_classes
- 1) .
我想使用类似的东西作为 Tensorflow 预处理操作的一部分,以避免将 SKLearn 用于包。例如,我了解预处理层为 OneHot 编码和分类编码提供了 APIs,如下所示:
tf.keras.layers.CategoryEncoding(
num_tokens=None, output_mode='multi_hot', sparse=False, **kwargs
)
有没有办法通过CategoryEncoding
API中的某些参数来使用LabelEncoder,或者我是否必须使用提供的abstract base class模板定义一个全新的预处理层在 Tensorflow 文档中?
如果是这样,是否有关于如何编写自己的 class 以将 LabelEncoder
用作 Tensorflow 层的参考资料?
IIUC,你只需要稀疏整数标签。所以,也许先尝试一些简单而天真的事情:
classes = ['fish1', 'fish2', 'fish3']
data = ['fish1', 'fish2', 'fish3', 'fish2', 'fish3', 'fish1']
class_indices = dict(zip(classes, range(len(classes))))
labels = list(map(class_indices.get, data))
print(labels)
[0, 1, 2, 1, 2, 0]
或者Tensorflow
,你可以使用StaticHashTable
:
import tensorflow as tf
classes = ['fish1', 'fish2', 'fish3']
data = tf.constant(['fish1', 'fish2', 'fish3', 'fish2', 'fish3', 'fish1'])
table = tf.lookup.StaticHashTable(
tf.lookup.KeyValueTensorInitializer(tf.constant(classes), tf.range(len(classes))),
default_value=-1)
label_encoder = tf.keras.layers.Lambda(lambda x: table.lookup(x))
print(label_encoder(data))
tf.Tensor([0 1 2 1 2 0], shape=(6,), dtype=int32)