"Please wrap your loss computation in a zero argument `lambda`." 是什么意思?
What does "Please wrap your loss computation in a zero argument `lambda`." means?
我编写了一个将L2损失添加到主损失函数的代码:
def add_l2(model, penalty=0.001):
for layer in model.layers:
if "conv" in layer.name:
model.add_loss(penalty * tf.reduce_sum(tf.square(layer.trainable_variables[0])))
return
## training
@tf.function
def train_one_step(model, x, y, optimizer):
with tf.GradientTape() as tape:
logits = model(x, training=True)
loss = _criterion(y_true=y, y_pred=logits)
add_l2(model, 0.001)
loss += sum(model.losses)
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
return loss, logits
当我开始训练时,出现如下错误:
ValueError: Expected a symbolic Tensors or a callable for the loss value. Please wrap your loss computation in a zero argument lambda
.
这个错误是什么意思?我该如何治疗?
您的损失引用了模型层之一的变量 (layer.trainable_variables[0]
),因此需要将您的损失包装在零参数 lambda 中,以使其可调用。
model.add_loss(lambda: penalty * tf.reduce_sum(tf.square(layer.trainable_variables[0])
更多细节请查看官方文档Here
我遇到了同样的问题并找到了解决方案。
问题: 在层的 call
函数之外调用 add_loss
时,losses
属性不会自动重置。
因此,随着每次迭代,它会累积越来越多的损失张量。这几乎不明显,可能会弄乱渐变。
解决方法,如果想在Layer的call
函数外加一个loss term,就是先清除_callable_losses
手动列出 然后添加包含在 lambda 函数中的损失项。
将您的示例更改为:
def add_l2(model, penalty=0.001):
# clear the losses list of model
model._callable_losses.clear()
for layer in model.layers:
if "conv" in layer.name:
model.add_loss(lambda: penalty * tf.reduce_sum(tf.square(layer.trainable_variables[0])))
return
应该可以解决问题。当然,这也消除了之前添加的任何损失。如果需要避免这种情况,可以通过 model._callable_losses.pop(idx)
删除 _callable_losses
中的单个条目
我编写了一个将L2损失添加到主损失函数的代码:
def add_l2(model, penalty=0.001):
for layer in model.layers:
if "conv" in layer.name:
model.add_loss(penalty * tf.reduce_sum(tf.square(layer.trainable_variables[0])))
return
## training
@tf.function
def train_one_step(model, x, y, optimizer):
with tf.GradientTape() as tape:
logits = model(x, training=True)
loss = _criterion(y_true=y, y_pred=logits)
add_l2(model, 0.001)
loss += sum(model.losses)
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
return loss, logits
当我开始训练时,出现如下错误:
ValueError: Expected a symbolic Tensors or a callable for the loss value. Please wrap your loss computation in a zero argument
lambda
.
这个错误是什么意思?我该如何治疗?
您的损失引用了模型层之一的变量 (layer.trainable_variables[0]
),因此需要将您的损失包装在零参数 lambda 中,以使其可调用。
model.add_loss(lambda: penalty * tf.reduce_sum(tf.square(layer.trainable_variables[0])
更多细节请查看官方文档Here
我遇到了同样的问题并找到了解决方案。
问题: 在层的 call
函数之外调用 add_loss
时,losses
属性不会自动重置。
因此,随着每次迭代,它会累积越来越多的损失张量。这几乎不明显,可能会弄乱渐变。
解决方法,如果想在Layer的call
函数外加一个loss term,就是先清除_callable_losses
手动列出 然后添加包含在 lambda 函数中的损失项。
将您的示例更改为:
def add_l2(model, penalty=0.001):
# clear the losses list of model
model._callable_losses.clear()
for layer in model.layers:
if "conv" in layer.name:
model.add_loss(lambda: penalty * tf.reduce_sum(tf.square(layer.trainable_variables[0])))
return
应该可以解决问题。当然,这也消除了之前添加的任何损失。如果需要避免这种情况,可以通过 model._callable_losses.pop(idx)
_callable_losses
中的单个条目