Python 使用Tensorflow梯度带的汉明距离损失函数:无梯度。它是不可微的吗?
我正在使用Tensorflow 2.1和Python 3,按照教程“”创建我的自定义培训模型 我试图在我的损失函数中使用汉明距离:Python 使用Tensorflow梯度带的汉明距离损失函数:无梯度。它是不可微的吗?,python,tensorflow,keras,deep-learning,eager-execution,Python,Tensorflow,Keras,Deep Learning,Eager Execution,我正在使用Tensorflow 2.1和Python 3,按照教程“”创建我的自定义培训模型 我试图在我的损失函数中使用汉明距离: import tensorflow as tf import tensorflow_addons as tfa def my_loss_hamming(model, x, y): global output output = model(x) return tfa.metrics.hamming.hamming_loss_fn(y, output,
import tensorflow as tf
import tensorflow_addons as tfa
def my_loss_hamming(model, x, y):
global output
output = model(x)
return tfa.metrics.hamming.hamming_loss_fn(y, output, threshold=0.5, mode='multilabel')
def grad(model, inputs, targets):
with tf.GradientTape() as tape:
tape.watch(model.trainable_variables)
loss_value = my_loss_hamming(model, inputs, targets)
return loss_value, tape.gradient(loss_value, model.trainable_variables)
当我称之为:
loss_value, grads = grad(model, feature, label)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
grads
变量是一个38无的列表
我得到了一个错误:
No gradients provided for any variable: ['conv1_1/kernel:0', ...]
有没有办法在不“中断梯度带记录的梯度链”的情况下使用汉明距离?如果我说的是明显的话,请道歉,但是反向传播作为神经网络拟合算法的工作方式是通过梯度-例如,对于每批训练数据,您计算如果将特定的可训练权重移动非常小的量
delta
,损失函数将改善/降低多少
根据定义,汉明损耗是不可微的,因此对于可训练重量的小运动,您将永远不会经历损耗的任何变化。我想它只是被添加用于对经过培训的模型的性能进行最终测量,而不是用于培训
如果你想通过反向传播训练一个神经网络,你需要使用一些可微损失-这样可以帮助模型在正确的方向上移动权重。有时,人们会使用不同的技术来平滑此类损失,如Hamming less和创建近似值-例如,在这里,它可能会惩罚较少的预测,这些预测更接近目标答案,而不是对高于阈值的所有预测都给出1,对其他所有预测都给出0。感谢您的回答。这个问题与这个问题相关:这里我解释一下我想做什么。还有另一个,你会知道我为什么用汉明距离。再次感谢。你的方法绝对没有问题。就像我说的,如果你想把损失函数用于训练,你只需要平滑它。谢谢,但我不知道如何把我的方法作为可微损失函数来使用。还有一个哈明距离损失函数,哈明损失。这也是不可微的吗?谢谢。从您的解释看来,您的输出具有形状
(BatchSize,FlattedPixelsnXm)
,目标是相同的形状,0/1值描述图像上的区域。使用threshold=0.5
hamming损耗有效地将每个>0.5的值替换为1和每个值,从而使输出离散化