为什么 tensorflow.one_hot 不是稀疏的?

Why tensorflow.one_hot is not sparse?

举个例子:

import tensorflow as tf
indices = [0, 1, 2]
depth = 3
tf.one_hot(indices, depth)

输出:

<tf.Tensor: id=9, shape=(3, 3), dtype=float32, numpy=
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]], dtype=float32)>

单热张量是稠密的。我想知道这种表示是否有效,特别是如果有很多类别。那么为什么 one_hot 输出默认是密集的呢?稀疏表示不会更便宜内存吗?

很有可能,因为如果您考虑用于分类的典型神经网络的输出,它是一个密集的似然向量。为了让优化算法修改神经网络的权重,必须计算误差向量。误差(或者实际上,平方误差)是输出的总和 - 真值(平方)。因此,以稀疏格式原生表示一种热编码只会导致 un-sparsifying 用于 optimization/backprop 操作。这种 非稀疏化 只会是一种浪费,每次训练迭代都会完成。

为了解决额外的问题 space...是的,它有点多 space 但标签 通常 包含现代训练的一小部分实际输入的数据(image/audio/etc。)要大得多。

我的想法遵循这样的假设,即单热向量用于标签……无论如何,这是我最常使用它们的地方。

为了争论,如果您要有一些与稀疏表示兼容的自定义层和输入并且需要具有稀疏标签表示,那么一个-时间转换为稀疏不会损害您的性能,因为使用非常快的库(例如scipy),这将是一次性(或可能几次)成本。