Tensorflow 损失函数没有提供梯度

Tensorflow loss function no gradient provided

目前我尝试编写自己的损失函数,但是当返回结果(一个包含损失值列表的张量)时,我收到以下错误:

ValueError: No gradients provided for any variable: ['conv2d/kernel:0', 'conv2d/bias:0', 'conv2d_1/kernel:0', 'conv2d_1/bias:0', 'dense/kernel:0', 'dense/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0', 'dense_2/kernel:0', 'dense_2/bias:0'].

但是在教程和他们的文档中他们也使用 tf.recude_mean 并且像他们一样使用它时(他们展示了如何编写 mse 损失函数)我没有得到错误,所以看起来我遗漏了一些东西

我的代码:

gl = tfa.losses.GIoULoss()
def loss(y_true, y_pred):
        batch_size = y_true.shape[0]
        # now contains 32 lists (a batch) of bbxs -> shape is (32, 7876)
        bbx_true = y_true.numpy()

        # now contains 32 lists (a batch) of bbxs here we have to double access [0] in order to get the entry itself 
        # -> shape is (32, 1, 1, 7876)
        bbx_pred = y_pred.numpy()

        losses = []
        curr_true = []
        curr_pred = []
        for i in range(batch_size):
            curr_true = bbx_true[i] 
            curr_pred = bbx_pred[i][0][0]


            curr_true = [curr_true[x:x+4] for x in range(0, len(curr_true), 4)]
            curr_pred = [curr_pred[x:x+4] for x in range(0, len(curr_pred), 4)]

            if len(curr_true) == 0:
                curr_true.append([0., 0.,0.,0.])

            curr_loss = gl(curr_true, curr_pred)

            losses.append(curr_loss)

        return tf.math.reduce_mean(losses, axis=-1)

基本上我想达到 bounding box regression,因此我想使用 GIoUloss 损失函数。因为我的模型输出 7896 个神经元(我想根据我的训练集预测的最大边界框数量乘以 4)并且 gioloss 函数需要输入作为一个列表数组,每个列表包含 4 个元素,所以我必须执行此转换。

我如何更改我的代码才能同时构建 gradient

Numpy 不提供 autograd 函数,因此您需要在损失中专门使用 Tensorflow 张量(否则梯度会在反向传播过程中丢失)。因此,请避免使用 .numpy() 并改用 tensorflow 运算符并在 tensoflow 张量上切片。