我编写了一个自定义训练循环,我还使用tf.GradientTape()计算了损耗和梯度
def grads_ds(model, inputs, y_true, cw):
with tf.GradientTape() as ds_tape:
y_pred = model(inputs)
y_true = to_categorical(y_true,NUM_CLASSES)
loss = -1*K.sum(y_true*cw*K.log(y_pred))
grads = ds_tape.gradient(loss,model_ds.trainable_variables,unconnected_gradients=tf.UnconnectedGradients.NONE)
return grads
现在,我不知道如何将重量衰减损失加到这种损失上。
我有一个经过预训练的网络,其输出为“全局平均池”,然后进行平坦化(第1层),然后馈入4096 FC层(第2层),随后是具有3个节点的最后一层(第3层)。
因此,我必须添加该零件的权重衰减损耗,因为我将经过预训练的零件保持冻结状态。
要增加重量衰减损失,我将通过以下代码计算出的损失加到交叉熵损失中
weight_decay_loss = 0.0
for layer in model.layers:
if layer.trainable == True:
if len(layer.get_weights())>0):
for i in range(2):
weight_decay_loss += l * K.sum(K.square(layer.get_weights()[i]))
最后我愿意
total_loss = K.sum(loss + weight_decay_loss)
这是在Keras中将体重减轻损失添加到总损失中的正确方法吗?