Le régularisateur est délicat d'une manière qu'il est seulement appelé une fois au cours la construction du modèle. En Layer.add_weight()
:
if regularizer is not None:
self.add_loss(regularizer(weight))
Une fois que le tenseur de perte de régularisation supplémentaire est obtenue avec regularizer(weight)
et ajouté au modèle, l'objet régularisateur lui-même est inutile et se est jeté. L'enregistrement de l'époque (en tant que int
ou float
) à l'intérieur de l'objet de régularisation ne fonctionnera pas.
Si vous voulez une valeur qui peut être manipulée pendant l'entraînement, vous devez faire une époque Variable
, et l'inclure dans le calcul du tenseur de perte de régularisation. Par exemple,
epoch_variable = K.variable(0.)
class MyRegularizer(Regularizer):
def __init__(self, epoch_variable):
self.epoch_variable = epoch_variable
def __call__(self, x):
# just to show that epoch is updated and used in loss computation
return self.epoch_variable ** 2
model = Sequential()
model.add(Dense(100, input_shape=(10,), kernel_regularizer=MyRegularizer(epoch_variable)))
model.add(Dense(1))
model.compile(loss='binary_crossentropy', optimizer='adam')
Pour mettre à jour la valeur de epoch_variable
, utilisez un rappel personnalisé:
class MyCallback(Callback):
def __init__(self, epoch_variable):
self.epoch_variable = epoch_variable
def on_epoch_begin(self, epoch, logs=None):
K.set_value(self.epoch_variable, epoch + 1)
model.fit(X, Y, callbacks=[MyCallback(epoch_variable)])
Vous devriez voir quelque chose comme:
Epoch 1/10
100/100 [==============================] - 0s - loss: 3.0042
Epoch 2/10
100/100 [==============================] - 0s - loss: 4.9652
Epoch 3/10
100/100 [==============================] - 0s - loss: 9.9544
Epoch 4/10
100/100 [==============================] - 0s - loss: 16.7814
Epoch 5/10
100/100 [==============================] - 0s - loss: 25.7923
Epoch 6/10
100/100 [==============================] - 0s - loss: 36.7659
Epoch 7/10
100/100 [==============================] - 0s - loss: 49.7384
Epoch 8/10
100/100 [==============================] - 0s - loss: 64.7239
Epoch 9/10
100/100 [==============================] - 0s - loss: 81.7514
Epoch 10/10
100/100 [==============================] - 0s - loss: 100.7349
Ceci est OK pour callbacks mais ni pour régularisations qui doivent modifier les choses dont dépend le dégradé. – nemo
Je vois ... ma réponse ne correspond pas vraiment à cela. –