当我执行分类工作时,我需要使用one_hot方法对classid进行编码。
但是shuold我可以使用tf.one_hot
函数用-1或0编码背景类吗?
例如:
// plan a
logits = [0.1, 0.1, 0.2, 0.3, 0.4]
classids = [-1,1,2,3,4] // -1 is background class
class_num = 5
on_hot_class = tf.one_hot(class_ids, depth=class_num)
loss = tf.keras.losses.categorical_crossentropy(one_hot_class,class_logits, from_logits=True)
// plan b
logits = [0.1, 0.1, 0.2, 0.3, 0.4]
classids = [0,1,2,3,4] // 0 is background class
class_num = 5
on_hot_class = tf.one_hot(class_ids, depth=class_num)
loss = tf.keras.losses.categorical_crossentropy(one_hot_class,class_logits, from_logits=True)
答案 0 :(得分:2)
通常,您将背景类与其他类一样对待,并编码为one_hot(on_value=1)
。如果您想强调此类,可以使用加权tf.nn.weighted_cross_entropy_with_logits
并为该类分配更高的权重。
由于您依赖于logits的交叉熵,因此logits函数的输出将始终在0到1之间。这意味着,只要模型看到背景类的输入,它就会始终产生高损失值。这很可能破坏您的训练。这仍然并不意味着您不能使用-1或在任何可以想象的情况下都不会产生积极影响。