我将使用tensorflow
实现此目的。
但问题是我不知道如何将分数转换为单热(上图中的红色线条)
假设我有一个model
类,它将所有张量操作都作为对象变量。
model.outputs
是一个张量操作(前馈)来获取scores
,我需要将此outputs
张量转换为一个热张量以一种不同的方式这样我就可以执行渐变操作。
我该如何实现?
答案 0 :(得分:0)
也许你可以有更简单的方法。下面的代码对我有用。
假设您的scores
或model.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]]