【问题标题】:Why we need `int64` for MNIST labels in a loss function , from tensorflow?为什么我们需要 `int64` 用于损失函数中的 MNIST 标签,来自 tensorflow?
【发布时间】:2017-05-01 15:41:47
【问题描述】:

代码摘自Tensorflow tutorial。该函数在 MNIST 数据集上运行操作,这是一个 0-9 的手写图片数据集。为什么要给int64打标签,我以为int32就够了。

def loss(logits,labels):
    labels = tf.to_int64(labels)
    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
        logits,labels,name='xentropy')
    loss = tf.reduce_mean(cross_entropy,name='xentropy_mean')
    return loss

【问题讨论】:

  • 其中一些转换是为了让 TensorFlow 在以 numpy 数组形式提供数据时使用与 numpy 相同的类型(numpy 整数默认为 int64)
  • 在这种情况下,转换应该会自动发生,对吧?我在没有指定dtype 的情况下定义数组时使用numpy 对其进行了测试,默认情况下它为int64。那么,为什么还要提前进行投射呢?
  • 如果您将int64 提供给 TensorFlow labels 节点,即int32,那么它必须在每次运行调用期间进行向下转换。 IE,它必须运行逻辑来查看输入值 int64 是否适合 int32 空间

标签: python tensorflow neural-network deep-learning mnist


【解决方案1】:

这个documentation 表示它可以是int32int64。因此,您可以选择其中之一。在这里,他们更愿意选择int64

引用文档:

labels:形状张量 [d_0, d_1, ..., d_{r-2}] 和 dtype int32int64labels 中的每个条目都必须是 [0, num_classes) 中的索引。在 CPU 上运行此操作时,其他值将引发异常,并返回 NaN 以获取 GPU 上相应的损失和梯度行。

【讨论】:

  • 那么为什么他们更喜欢 int64 呢?
  • 我认为这是因为 64 位机器上的兼容性和效率原因,这在当今更为常见。在 32 位机器中,int64 可以使用两个 32 位内存地址来表示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 2021-07-08
  • 2018-06-14
  • 2019-04-07
相关资源
最近更新 更多