如何调整单热标签的尺寸并保持有效?

时间:2017-09-12 09:48:18

标签: tensorflow

给出一批长度为10的单热标签:

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

...

I can trim it by 1 by using tf.slice():

[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.]

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

但注意到第一行不再是有效的单热标签(其中一列必须设置为1)。我如何使其有效:

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

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

如果没有列设置为1,则单热标签中的最后一个列设置为1.

谢谢。

编辑:我想我应该澄清一下,使其更具体。让我们说我使用的是MNIST的单热标签。我决定用10个数字代替10位数,我只想标记0-8而不是0-9的所有内容。我希望将所有9个标签转换为6个标签。 因此,我想将单热的形状从10减少到9.并修复与此更改相对应的标签。

例如: 如果原始编码是:(5,0,9),它现在应该改为(5,0,6)。 用[0。 0. 0 0. 0 0. 0 0. 0 1. 1.]变为[0。 0. 0 0. 0 0. 0. 0. 0.]

2 个答案:

答案 0 :(得分:0)

一种方法是:

# Trim your one_hot in a tensor trimmed
exists = tf.reduce_sum(trimmed, axis=1)
zeros = tf.zeros_like(trimmed[:,:-1])
ones = tf.ones_like(trimmed[:,0:1])
zeros_ones = tf.concat((zeros,ones), axis=1)
final = tf.where(exists>1, trimmed, zeros_ones)

例如:

trimmed = [[0,0,1], [0,0,0], [1,0,0]]
exists = [1,0,1]
zeros_ones = [[0,0,1], [0,0,1], [0,0,1]]
final = [[0,0,1],[0,0,1],[1,0,0]]

答案 1 :(得分:0)

有关

data = tf.constant([[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
                   [ 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.]])

只需使用:

data[:, -2] += data[:, -1]

在应用tf.slice()之前。 由于这些都是一个热门的向量,这一行就足够了。