我目前正在使用以下损失功能:
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits, labels))
然而,我的损失很快就接近于零,因为有大约1000个类,并且对于任何示例只有少数几个(参见附图),算法只是学习几乎完全预测零。我担心这会妨碍学习,即使损失继续略微趋向于零。是否有我应该考虑的替代损失函数?
答案 0 :(得分:0)
您是否尝试将一个多标签目标矢量投影到多个单热矢量中?
忍受我一会儿。为简洁起见,我将在numpy中构建损失函数。
在模型输出上应用sigmoids。我们称之为 y 。这将是每个班级的概率。为简单起见,我将从单位制服中采样。
y = np.random.uniform(0,1,size=[5]) # inferred
y_true = np.array([1, 0, 0, 1, 0]) #multi-label target vector
projection = y_true*np.identity(5) #expand each label into one separate one-hot vector
cross_entropy = -projection*np.log(y) # cross entropy for each label
loss = np.sum(cross_entropy) # sum cross entropies for different labels
我相信现在计算渐变的最大重量将落在非零元素(标签)中,渐变将指向令所有标签满意的方向。
我错过了什么吗?