gpt4 book ai didi

TensorFlow 损失函数在第一个 epoch 后归零

转载 作者:行者123 更新时间:2023-12-03 16:37:18 27 4
gpt4 key购买 nike

我正在尝试基于本文实现一个判别性损失函数,例如图像分割:https://arxiv.org/pdf/1708.02551.pdf (此链接仅供读者引用;我不希望有人阅读它来帮助我!)

我的问题:一旦我从一个简单的损失函数转移到一个更复杂的损失函数(就像你在附加的代码片段中看到的那样),损失函数在第一个 epoch 后归零。我检查了权重,几乎所有的权重似乎都在 -300 附近徘徊。它们并不完全相同,但彼此非常接近(仅在小数位上有所不同)。

相关代码实现判别式损失函数:

def regDLF(y_true, y_pred):
global alpha
global beta
global gamma
global delta_v
global delta_d
global image_height
global image_width
global nDim

y_true = tf.reshape(y_true, [image_height*image_width])

X = tf.reshape(y_pred, [image_height*image_width, nDim])
uniqueLabels, uniqueInd = tf.unique(y_true)

numUnique = tf.size(uniqueLabels)

Sigma = tf.unsorted_segment_sum(X, uniqueInd, numUnique)
ones_Sigma = tf.ones((tf.shape(X)[0], 1))
ones_Sigma = tf.unsorted_segment_sum(ones_Sigma,uniqueInd, numUnique)
mu = tf.divide(Sigma, ones_Sigma)

Lreg = tf.reduce_mean(tf.norm(mu, axis = 1))

T = tf.norm(tf.subtract(tf.gather(mu, uniqueInd), X), axis = 1)
T = tf.divide(T, Lreg)
T = tf.subtract(T, delta_v)
T = tf.clip_by_value(T, 0, T)
T = tf.square(T)

ones_Sigma = tf.ones_like(uniqueInd, dtype = tf.float32)
ones_Sigma = tf.unsorted_segment_sum(ones_Sigma,uniqueInd, numUnique)
clusterSigma = tf.unsorted_segment_sum(T, uniqueInd, numUnique)
clusterSigma = tf.divide(clusterSigma, ones_Sigma)

Lvar = tf.reduce_mean(clusterSigma, axis = 0)

mu_interleaved_rep = tf.tile(mu, [numUnique, 1])
mu_band_rep = tf.tile(mu, [1, numUnique])
mu_band_rep = tf.reshape(mu_band_rep, (numUnique*numUnique, nDim))

mu_diff = tf.subtract(mu_band_rep, mu_interleaved_rep)
mu_diff = tf.norm(mu_diff, axis = 1)
mu_diff = tf.divide(mu_diff, Lreg)

mu_diff = tf.subtract(2*delta_d, mu_diff)
mu_diff = tf.clip_by_value(mu_diff, 0, mu_diff)
mu_diff = tf.square(mu_diff)

numUniqueF = tf.cast(numUnique, tf.float32)
Ldist = tf.reduce_mean(mu_diff)

L = alpha * Lvar + beta * Ldist + gamma * Lreg

return L

问题:我知道不阅读论文很难理解代码的作用,但我有几个问题:
  • 定义的损失函数有什么明显的错误吗
    以上?
  • 任何人都知道为什么损失函数会在第一个纪元后归零?

  • 非常感谢您的时间和帮助!

    最佳答案

    我认为您的问题受到不安全的 tf.norm 的影响(导致向量中某处为零,因此其梯度为 nan )。
    用这个自定义函数替换 tf.norm 会更好:

    def tf_norm(inputs, axis=1, epsilon=1e-7,  name='safe_norm'):
    squared_norm = tf.reduce_sum(tf.square(inputs), axis=axis, keep_dims=True)
    safe_norm = tf.sqrt(squared_norm+epsilon)
    return tf.identity(safe_norm, name=name)

    关于TensorFlow 损失函数在第一个 epoch 后归零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46359221/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com