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 函数。
这个函数需要:
- 索引列表(您的
logits
向量)
- 一个
depth
参数:即one-hot向量的深度(one-hot编码标签的长度)
on_value
& off_value
你可以根据需要更改(但默认值 1 和 0 是你要找的)。
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]]
我想转换
形式的张量(称之为 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 函数。
这个函数需要:
- 索引列表(您的
logits
向量) - 一个
depth
参数:即one-hot向量的深度(one-hot编码标签的长度) on_value
&off_value
你可以根据需要更改(但默认值 1 和 0 是你要找的)。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]]