您好我正在尝试使用自定义丢失功能微调初始网络。这是一个三重损失功能。
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_variance
和BatchNorm/moving_variance
具有无渐变。为什么它返回无梯度值?
通过可视化,我发现没有数据流从丢失到BatchNorm范围,为什么权重有来自损失节点的数据流但Batchnorm没有?
答案 0 :(得分:0)
这些无渐变只属于batchNorm图层,因此我对batchNorm进行了一些研究。阅读Bolg http://ruishu.io/2016/12/27/batchnorm/
之后我发现了
训练
根据小批量统计数据标准化图层激活。 在培训步骤中,通过小批量统计的移动平均值更新人口统计近似值。
测试
根据估计的人口统计数据标准化图层激活。不要根据测试数据中的小批量统计信息更新人口统计数据。
在将相位键设置为推理功能的训练后,问题就解决了。