1

我正在使用 Tensorflow 2.1 和 Python 3,按照教程“ Tensorflow - 自定义训练:演练”创建我的自定义训练模型。

我正在尝试在我的损失函数上使用汉明距离:

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', ...]

有没有什么方法可以使用汉明距离而不“中断渐变胶带注册的渐变链”?

4

1 回答 1

2

抱歉,如果我说的很明显,但是反向传播作为神经网络的拟合算法的工作方式是通过梯度 - 例如,对于每批训练数据,您计算如果移动特定的可训练数据,损失函数将改善/降低多少重量由非常小的量delta

根据定义,汉明损失是不可微的,因此对于可训练权重的小幅移动,您将永远不会体验到损失的任何变化。我想它只是被添加用于训练模型性能的最终测量,而不是用于训练。

如果你想通过反向传播训练神经网络,你需要使用一些可微的损失——这样可以帮助模型向正确的方向移动权重。有时人们使用不同的技术来平滑这种损失,例如更少的汉明并创建近似值 - 例如,这里可能会惩罚更接近目标答案的更少预测,而不是对高于阈值的所有内容给出 1,对其他所有内容给出 0。

于 2020-06-11T05:39:12.867 回答