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 张量上切片。
目前我尝试编写自己的损失函数,但是当返回结果(一个包含损失值列表的张量)时,我收到以下错误:
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 张量上切片。