给出一批长度为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.]
答案 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()
之前。
由于这些都是一个热门的向量,这一行就足够了。