0

我想转换形式的张量(称之为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].

所以我需要“矢量化”标签!?有谁知道如何做到这一点?

4

1 回答 1

1

标签“矢量化”称为单热编码。

您正在寻找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]]
于 2016-06-17T15:04:02.500 回答