Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Tensorflow梯度带的汉明距离损失函数:无梯度。它是不可微的吗?_Python_Tensorflow_Keras_Deep Learning_Eager Execution - Fatal编程技术网

Python 使用Tensorflow梯度带的汉明距离损失函数:无梯度。它是不可微的吗?

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,

我正在使用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, 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和每个值,从而使输出离散化