我构建了一个自定义 Keras 模型,其中包含各种层。由于我想要向这些层添加 L2 正则化,因此我将
然而,在我的情况下,我有一个自定义损失函数,除了
keras.regularizers.l2
的一个实例作为这些层的 kernel_regularizer
参数的值进行了传递(例如,请参见keras.layers.Conv2D
类的构造函数)。现在,如果我使用 Keras 实现的二元交叉熵损失函数(keras.losses.BinaryCrossentropy
)训练此模型,那么当计算损失时将考虑到我指定的 L2 正则化。然而,在我的情况下,我有一个自定义损失函数,除了
y_true
和y_pred
之外还需要几个其他参数,这意味着我无法将此函数作为model.compile(...)
的loss
参数的值进行传递(事实上,我甚至不调用model.compile(...)
)。因此,我还必须编写自定义训练循环。换句话说,我不是简单地运行model.fit(...)
,而是:
- 通过调用
model(x)
进行前向传播 - 计算损失
- 使用
tf.GradientTape
计算相对于模型权重(即model.trainable_variables
)的损失梯度 - 应用梯度
- 重复
- 在前向传播期间?
- 在计算/应用梯度期间?
kernel_regularizer
参数的值)。在那种情况下,我是否需要手动计算正则化项并将其添加到损失中?
machine-learning
标签信息 中的注意事项(也适用于深度学习问题)。 - desertnaut