MNIST Tensorflow:如何将 [i] 形式的张量操作为 [...0,0,0,1,0,0...] 形式的张量,其中 1 在第 i 个位置?

MNIST Tensorflow: How to manipulate a tensor of the form [i] to a tensor of a form [...0,0,0,1,0,0...] where 1 is at ith position?

我想转换

形式的张量(称之为 logits)
int32 - [batch_size]

到形式为

的张量(称之为标签)
 [batch_size, 10]

例如 batch_size=3

logits=[1,6,9]
labels=[[0,1,0,0,0,0,0,0,0,0],
        [0,0,0,0,0,0,1,0,0,0],
        [0,0,0,0,0,0,0,0,0,1]]

出现这个问题是因为我想在 tensorflow mnist 示例中将成本函数更改为二次函数 (https://github.com/tensorflow/tensorflow/tree/r0.9/tensorflow/examples/tutorials/mnist) 我使用 fully_connected_feed.py 和 mnist.py。在 mnist.py 我想改变:

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

loss= tf.reduce_sum(tf.squared_difference(logits,labels))

但问题在于:

Logits tensor, float - [batch_size, 10];  
Labels tensor, int64 - [batch_size].

所以我需要 "vectorize" 标签!? 有谁知道如何做到这一点?

标签"vectorization"称为one-hot编码。

您正在寻找 tf.one_hot 函数。

这个函数需要:

  1. 索引列表(您的 logits 向量)
  2. 一个depth参数:即one-hot向量的深度(one-hot编码标签的长度)
  3. on_value & off_value 你可以根据需要更改(但默认值 1 和 0 是你要找的)。
  4. dtype 这就是张量输出类型。

因此,您可以使用以下方法对标签进行一次性编码:

one_hot_labels = tf.one_hot(logits, 10, dtype=tf.uint8)

one_hot_labels 是一个 tf.Tensor 对象。

如果你需要从python访问它的内容,记得eval(或运行它)。

这是一个玩具示例:

import tensorflow as tf.
tf.InteractiveSession()
logits=[1,6,9]
one_hot_labels = tf.one_hot(logits, 10, dtype=tf.uint8)
print(one_hot_labels.eval())

输出:

[[0 1 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 1 0 0 0]
 [0 0 0 0 0 0 0 0 0 1]]