Я пытаюсь создать собственный регуляризатор Keras, который использует расстояние от веса слоя до его первоначального веса, но то, что я использовал, похоже, не работает.Кажется, что этот регуляризатор никак не влияет на тренировку и функцию потери.
Не могли бы вы помочь мне понять, что я делаю не так?
class NormReg():
def __init__(self, coeff):
self._coeff = coeff
self._original_weights = None
def _norm(self, weight_matrix):
return K.sum(K.square(weight_matrix))
def __call__(self, weight_matrix):
if self._original_weights is None:
self._original_weights = weight_matrix
diff_matrix = weight_matrix - self._original_weights
return self._coeff * self._norm(diff_matrix)
(я использую тензор потока в качестве бэкэнда)
Редактировать: Немного поиграв с этим классом, я заметил кое-что странное: как будто объект регуляризатора создается снова и снова в процессе обучения в каждой партии, что объясняет, почему я получаю нули.Я пришел к такому выводу, изменив класс на -
class NormReg():
def __init__(self, coeff):
self._ugly_check = 1
self._coeff = coeff
self._original_weights = None
def _norm(self, weight_matrix):
return K.sum(K.square(weight_matrix))
def __call__(self, weight_matrix):
if self._original_weights is None:
self._original_weights = weight_matrix
if self._ugly_check == 1:
self._ugly_check = 0
return 10000
diff_matrix = weight_matrix - self._original_weights
return self._coeff * self._norm(diff_matrix)
И, увидев, что потеря действительно понесет штраф, вытекающий из того, что _ugly_check равен 1 на протяжении всего обучения.