Tensorflow:将输出张量转换为单热

时间:2017-10-20 01:26:25

标签: tensorflow

我想做什么:(来自cs231n冬季课程) enter image description here

我将使用tensorflow实现此目的。

但问题是我不知道如何将分数转换为单热(上图中的红色线条)

假设我有一个model类,它将所有张量操作都作为对象变量。

model.outputs是一个张量操作(前馈)来获取scores,我需要将此outputs张量转换为一个热张量以一种不同的方式这样我就可以执行渐变操作。

我该如何实现?

1 个答案:

答案 0 :(得分:0)

也许你可以有更简单的方法。下面的代码对我有用。

假设您的scoresmodel.outputs节点的形状为[batch, #class]。在下面的示例中,我们使用batch_size = 2,我们有4 classes

tf.reset_default_graph()
batch_size=2
score = tf.constant([[0.5, 0.6, 0.2, 0.01], 
                     [0.8, 0.75, 1.0, 1.0]])
max_indices = tf.argmax(score, dimension=1)
base_indices = tf.cast(tf.range(batch_size), tf.int64)
sparse_indices = tf.stack([base_indices, max_indices])
values = tf.ones(batch_size)

s = tf.SparseTensor(indices=sparse_indices, values=values, dense_shape=score.shape)

with tf.Session() as sess:
  print sess.run(tf.sparse_tensor_to_dense(s))

>> [[ 0.  1.  0.  0.]
    [ 0.  0.  1.  0.]]

修改即可。如果你不想打破前1名的关系,那么一热就变成了n-hot),你可以做下面的事情:

tf.reset_default_graph()
batch_size=2
num_classes=4
score = tf.constant([[0.5, 0.6, 0.2, 0.01], 
                     [0.8, 0.75, 1.0, 1.0]])

max_per_instance = tf.expand_dims(tf.reduce_max(score, axis=1), 0)
tiled = tf.tile(max_per_instance, [num_classes, 1])
n_hot = tf.cast(tf.equal(score, tf.transpose(tiled)), tf.int32)
with tf.Session() as sess:
  print sess.run(n_hot)

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