余弦相似度损失导致权重值爆炸

时间:2019-11-17 11:15:31

标签: tensorflow deep-learning computer-vision

假设我的数据由气泡图像组成,并且标签是描述大小分布的直方图,例如:

0-10mm 10% 
10-20mm 30%
20-30mm 40%
30-40mm 20%

请注意-

  • 所有尺寸百分比总和为100%(或更精确地说为1.0)。
  • 我没有注释数据,所以我不能训练对象检测器,然后仅通过对检测到的对象进行计数来计算分布。但是,我的数据上确实有一个特征提取器训练。

我实现了一个包含-

的简单CNN
  • Resnet50主干网。
  • 全局最大池化。
  • 1个x1卷积的6个过滤器(标签中有6个分配箱)。

经过一些实验,我得出的结论是作为损失函数的softmax和交叉熵不适合我的问题和需求。

我认为,稍微修改一下余弦相似度可能是一个很好的选择(规范化将是后期处理的一部分)。这是实现:

def cosine_similarity_loss(logits, probs, weights=1.0, label_smoothing=0):

    x1_val = tf.sqrt(tf.reduce_sum(tf.matmul(logits, tf.transpose(logits)), axis=1))
    x2_val = tf.sqrt(tf.reduce_sum(tf.matmul(probs, tf.transpose(probs)), axis=1))
    denom = tf.multiply(x1_val, x2_val)

    num = tf.reduce_sum(tf.multiply(logits, probs), axis=1)
    cosine_sim = tf.math.divide(num, denom)
    cosine_dist = tf.math.reduce_mean(1 - tf.square(cosine_sim))  # Cosine Distance. Reduce mean for shape compatibility.

    return cosine_dist
损失是余弦距离和权重的12正则化的总和。在第一次前馈之后,我得到了loss: 3.1267,在第二次前馈之后,我得到了loss: 96003645440.0000-意思是权重爆炸了(logits: [[-785595.812 -553858.625 -545579.625 -148547.875 -12845.8633 19871.1055]]probs: [[0.466 0.297 0.19 0.047 0 0]])。

如此迅猛增长的原因可能是什么?

1 个答案:

答案 0 :(得分:0)

我的猜测是,余弦距离对logits进行了内部归一化,从而消除了幅度,因此没有梯度可以对付增加的值。 BTW weights未在您的实现中使用。

在最后一层使用Sigmoid而不是softmax来实现简单的欧几里得距离。另外,我会尝试在resnet50和输出密集层之间添加另一个一或两个密集层(例如512号)。