gpt4 book ai didi

python - 如何在 tensorflow 自定义训练循环中考虑 l1 和 l2 正则化器?

转载 作者:行者123 更新时间:2023-12-04 02:34:55 25 4
gpt4 key购买 nike

在使用 model.fit_on_batch 方法和 custom training loops 时我意识到在自定义训练循环代码中,损失和梯度没有考虑任何 l1-l2 正则化器,因此 optimizer.apply_gradients 方法没有考虑正则化器。您可以在下面找到显示此代码的代码,但这个想法非常简单。所以我的问题是,是否有一种方法可以以与优化器细节无关的方式使用所有这些优化器来考虑正则化器。它在 Keras 中是如何实现的?在相关说明中,model.fit_on_batch 返回一个值,它不是损失(如文档字符串中所述)而是其他值。我想知道这里是否有人知道它会返回什么。

代码

要看到这个效果先创建一些数据

x=tf.constant([[1]])
y=tf.constant([[1]])

并创建一个函数来制作可重现的模型

def make_model(l1=.01,l2=.01):
tf.random.set_seed(42)
np.random.seed(42)
model=tf.keras.models.Sequential([
tf.keras.layers.Dense(2,'softmax',
use_bias=False,
kernel_regularizer=tf.keras.regularizers.l1_l2(l1=l1,l2=l2),
input_shape=(1,))
])
return model

现在运行 Keras train_on_batch

model=make_model()
loss_object=tf.keras.losses.SparseCategoricalCrossentropy()
optimizer=tf.keras.optimizers.RMSprop()
model.compile(loss=loss_object,optimizer=optimizer)
model.train_on_batch(x,y)

并将输出与上面链接以及 here 中说明的自定义训练循环进行比较

model=make_model()
loss_object=tf.keras.losses.SparseCategoricalCrossentropy()
optimizer=tf.keras.optimizers.RMSprop()

@tf.function
def train_step(x,y):

with tf.GradientTape() as tape:
predictions = model(x)
loss = loss_object(y, predictions)

gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
return loss

train_step(x,y).numpy()

你会看到两个结果是不同的,除非 l1==0 和 l2==0。

最佳答案

其实我在Aurelien Geron的书中找到了答案enter image description here

事实上,在我实现了下面的代码之后,我发现这在 tensorflow guide on custom training 中被涵盖了。 (我不知道为什么它不在问题中提到的教程中,因为它很重要)。那里的解决方案比这里提到的解决方案更通用,但我保留了这一点,因为它更清楚地说明了正在发生的事情。

所以很简单,修改自定义训练循环为

def add_model_regularizer_loss(model):
loss=0
for l in model.layers:
if hasattr(l,'layers') and l.layers: # the layer itself is a model
loss+=add_model_loss(l)
if hasattr(l,'kernel_regularizer') and l.kernel_regularizer:
loss+=l.kernel_regularizer(l.kernel)
if hasattr(l,'bias_regularizer') and l.bias_regularizer:
loss+=l.bias_regularizer(l.bias)
return loss

def train_step(x,y):

with tf.GradientTape() as tape:
predictions = model(x)
loss = loss_object(y, predictions)
loss += add_model_regularizer_loss(model)

gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
return loss

回答我问题的第二部分,keras的模型拟合方法返回的就是这个损失值。

关于python - 如何在 tensorflow 自定义训练循环中考虑 l1 和 l2 正则化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62440162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com