【问题标题】:Is this one-hot encoding in TensorFlow fast? Or flawed for any reason?TensorFlow 中的这种 one-hot 编码速度快吗?还是因为任何原因有缺陷?
【发布时间】:2016-02-05 14:08:45
【问题描述】:

关于使用 TensorFlow 计算 one-hot 嵌入存在一些堆栈溢出问题,以下是公认的解决方案:

num_labels = 10
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.reshape(tf.concat(0, [derived_size, [num_labels]]), [-1])
labels = tf.sparse_to_dense(concated, outshape, 1.0, 0.0)

这与官方教程中的代码几乎相同:https://www.tensorflow.org/versions/0.6.0/tutorials/mnist/tf/index.html

在我看来,既然tf.nn.embedding_lookup 存在,它可能更有效。这是一个使用它的版本,它支持任意形状的输入:

def one_hot(inputs, num_classes):
    with tf.device('/cpu:0'):
        table = tf.constant(np.identity(num_classes, dtype=np.float32))
        embeddings = tf.nn.embedding_lookup(table, inputs)
    return embeddings

您希望此实现更快吗?是否因为其他原因存在缺陷?

【问题讨论】:

  • inferior 是一种主观质量。能不能客观的表达一下。例如时间、记忆、产生错误;可以测量的东西。
  • 您的问题对 TensorFlow 开发人员来说是显而易见的,但对我来说不是。我发现 TensorFlow 示例非常可靠:不止一次我认为我正在改进某些东西,后来意识到他们在设计时非常小心(尽管缺乏文档)。对我来说,这个 one-hot 编码器更好(更易读、更通用、可能更快),但我想看看它是否存在我看不到的缺陷。
  • 我明白了。我添加了评论,因为 StackOverflow 对问题有特定要求,如果新人看到这一点,他们可能会开始提出更多不允许的主观问题。 TensorFlow标签更宽容,但如果不遵守标准,标签将变得毫无价值,我想长期使用它。
  • 我明白了。我对其进行了编辑以使其更加具体。

标签: tensorflow


【解决方案1】:

您问题中的 one_hot() 函数看起来是正确的。但是,我们不建议以这种方式编写代码的原因是它内存效率非常低。为了理解原因,假设您有 32 个批量大小和 1,000,000 个类。

  • 在本教程建议的版本中,最大张量将是tf.sparse_to_dense() 的结果,即32 x 1000000

  • 在问题的one_hot() 函数中,最大张量将是np.identity(1000000) 的结果,即4 TB。当然,分配这个张量可能不会成功。即使类的数量少得多,显式存储所有这些零仍然会浪费内存——TensorFlow 不会自动将您的数据转换为稀疏表示,即使这样做可能是有利可图的。

    李>

最后,我想为最近添加到开源存储库中的新功能提供一个插件,并将在下一个版本中提供。 tf.nn.sparse_softmax_cross_entropy_with_logits() 允许您将整数向量指定为标签,从而使您不必构建密集的 one-hot 表示。对于大量类,任一 解决方案应该更有效。

【讨论】:

  • 在 mrry 的回答提示下,我已更改现有的 MNIST convolutional.py 和 CIFAR 模型以使用此新操作,因此它们作为示例很有用:github.com/tensorflow/tensorflow/blob/master/tensorflow/models/…
  • 有一点我仍然很不清楚:为什么计算图中的内存比用于存储训练数据的内存更重要?存储包含 1,000,000 个类的单热编码训练数据似乎是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 2016-09-17
  • 2018-05-09
  • 2021-04-14
  • 2021-02-23
相关资源
最近更新 更多