初始网络BatchNorm图层返回无渐变

时间:2017-09-24 05:12:36

标签: tensorflow

您好我正在尝试使用自定义丢失功能微调初始网络。这是一个三重损失功能。

此功能来自facenet.py

def triplet_loss(value, alpha):
    """Calculate the triplet loss according to the FaceNet paper

    Args:
      value: the embeddings for the anchor, positive, negative images.

    Returns:
      the triplet loss according to the FaceNet paper as a float tensor.
    """
    # The following function ensuer, it is evenly divided
    anchor, positive, negative = tf.split(value, num_or_size_splits=3, axis=0)

    with tf.variable_scope('triplet_loss'):
        pos_dist = tf.reduce_sum(tf.square(tf.subtract(anchor, positive)), 1)
        neg_dist = tf.reduce_sum(tf.square(tf.subtract(anchor, negative)), 1)

        basic_loss = tf.add(tf.subtract(pos_dist, neg_dist), alpha)
        loss = tf.reduce_mean(tf.maximum(basic_loss, 0.0), 0)
        # TODO: added by me
        tf.add_to_collection('losses', loss)
    return loss

注意:值param是softmax之前的logits图层的输出。

当我计算渐变时,我发现BatchNorm/moving_varianceBatchNorm/moving_variance具有无渐变。为什么它返回无梯度值?

通过可视化,我发现没有数据流从丢失到BatchNorm范围,为什么权重有来自损失节点的数据流但Batchnorm没有?

enter image description here

1 个答案:

答案 0 :(得分:0)

这些无渐变只属于batchNorm图层,因此我对batchNorm进行了一些研究。阅读Bolg http://ruishu.io/2016/12/27/batchnorm/之后我发现了

批次标准化在训练期间与测试时间有不同的行为。

  • 训练

    根据小批量统计数据标准化图层激活。 在培训步骤中,通过小批量统计的移动平均值更新人口统计近似值。

  • 测试

    根据估计的人口统计数据标准化图层激活。不要根据测试数据中的小批量统计信息更新人口统计数据。

在将相位键设置为推理功能的训练后,问题就解决了。