Tensorflow一个热编码器?
machine-learning
neural-network
python
tensorflow
4
0

张量流是否具有类似于scikit Learn的一种用于处理分类数据的热编码器 ?使用tf.string的占位符会表现为分类数据吗?

我意识到我可以在将数据发送到tensorflow之前对其进行手动预处理,但是将其内置非常方便。

参考资料:
Stack Overflow
收藏
评论
共 9 个回答
高赞 时间 活跃

numpy做到了!

import numpy as np
np.eye(n_labels)[target_vector]
收藏
评论

Scikit Flow中有embedding_ops以及处理分类变量的示例等。

如果您只是开始学习TensorFlow,我建议您先尝试TensorFlow / skflow中的 示例 ,然后一旦您对TensorFlow更加熟悉,就可以很容易地插入TensorFlow代码来构建所需的自定义模型(有也是示例)。

希望这些图像和文字理解示例可以帮助您入门,并在遇到任何问题时通知我们! (在SO中发布问题或标记skflow)。

收藏
评论

tf.one_hot()在TF中可用并且易于使用。

假设您有4种可能的类别(猫,狗,鸟,人)和2个实例(猫,人)。因此,您的depth=4indices=[0, 3]

import tensorflow as tf
res = tf.one_hot(indices=[0, 3], depth=4)
with tf.Session() as sess:
    print sess.run(res)

请记住,如果您提供index = -1,您将在单热向量中获得全零。

旧答案,当此功能不可用时。

在查看了python文档之后 ,我没有发现任何类似的东西。令我坚信不存在的一件事是,在他们自己的示例中,他们手动编写了one_hot

def dense_to_one_hot(labels_dense, num_classes=10):
  """Convert class labels from scalars to one-hot vectors."""
  num_labels = labels_dense.shape[0]
  index_offset = numpy.arange(num_labels) * num_classes
  labels_one_hot = numpy.zeros((num_labels, num_classes))
  labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1
  return labels_one_hot

您也可以在scikitlearn中执行此操作

收藏
评论

从TensorFlow 0.8开始,现在有一个原生的一站式操作tf.one_hot ,可以将一组稀疏标签转换为密集的一站式表示形式。这是tf.nn.sparse_softmax_cross_entropy_with_logits ,在某些情况下,可以让您直接在稀疏标签上计算交叉熵,而不是将它们转换为tf.nn.sparse_softmax_cross_entropy_with_logits热。

以前的答案,以防您想采用旧方法: @Salvador的答案是正确的-过去(过去)没有本机操作。但是,您可以使用稀疏到密集运算符在tensorflow中本地执行此操作,而不是在numpy中执行此操作:

num_labels = 10

# label_batch is a tensor of numeric labels to process
# 0 <= label < num_labels

sparse_labels = tf.reshape(label_batch, [-1, 1])
derived_size = tf.shape(label_batch)[0]
indices = tf.reshape(tf.range(0, derived_size, 1), [-1, 1])
concated = tf.concat(1, [indices, sparse_labels])
outshape = tf.pack([derived_size, num_labels])
labels = tf.sparse_to_dense(concated, outshape, 1.0, 0.0)

输出,labels,是batch_size x num_labels的单矩阵。

另请注意,自tf.nn.sparse_softmax_cross_entropy_with_logits日起(我认为最终将成为0.7版本的一部分),TensorFlow还具有tf.nn.sparse_softmax_cross_entropy_with_logits op,在某些情况下,您可以进行培训而无需转换为一键编码。

编辑添加:最后,您可能需要显式设置标签的形状。形状推断无法识别num_labels组件的大小。如果您不需要带有Derived_size的动态批处理大小,则可以简化此过程。

编辑于2016年2月12日,更改了以下每个注释的形状分配。

收藏
评论

看一下tf.nn.embedding_lookup 。它从类别ID映射到其嵌入。

有关如何将其用于输入数据的示例,请参见此处

收藏
评论

一种简单且简短的热编码任何整数或整数列表的方法:

a = 5 
b = [1, 2, 3]
# one hot an integer
one_hot_a = tf.nn.embedding_lookup(np.identity(10), a)
# one hot a list of integers
one_hot_b = tf.nn.embedding_lookup(np.identity(max(b)+1), b)
收藏
评论

您可以使用tf.sparse_to_dense

sparse_indices参数指示应该去的地方,应将output_shape设置为可能的输出数量(例如标签的数量),并且sparse_values的值应为1,并具有所需的类型(它将根据类型确定输出的类型。 sparse_values)。

收藏
评论

TensorFlow的最新版本(每夜甚至是0.7.1)都有一个名为tf.one_hot的操作,可以完成您想要的操作。一探究竟!

另一方面,如果您有一个密集矩阵,并且想要查找并汇总其中的值,则需要使用embedding_lookup函数。

收藏
评论

也许是由于自2015年11月以来对Tensorflow的更改,但是@dga的答案产生了错误。我的确做了以下修改:

sparse_labels = tf.reshape(label_batch, [-1, 1])
derived_size = tf.shape(sparse_labels)[0]
indices = tf.reshape(tf.range(0, derived_size, 1), [-1, 1])
concated = tf.concat(1, [indices, sparse_labels])
outshape = tf.concat(0, [tf.reshape(derived_size, [1]), tf.reshape(num_labels, [1])])
labels = tf.sparse_to_dense(concated, outshape, 1.0, 0.0)
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号