Можно ли установить model.loss
в обратном вызове без повторной компиляции model.compile(...)
после (с тех пор состояния оптимизатора сбрасываются), и просто перекомпилировать model.loss
, как, например,
class NewCallback(Callback):
def __init__(self):
super(NewCallback,self).__init__()
def on_epoch_end(self, epoch, logs={}):
self.model.loss=[loss_wrapper(t_change, current_epoch=epoch)]
self.model.compile_only_loss() # is there a version or hack of
# model.compile(...) like this?
Чтобы больше узнать о предыдущих примерах stackoverflow:
Для достижения функции потерь, которая зависит от номера эпохи, например (как в этот вопрос о стекопотоке ):
def loss_wrapper(t_change, current_epoch):
def custom_loss(y_true, y_pred):
c_epoch = K.get_value(current_epoch)
if c_epoch < t_change:
# compute loss_1
else:
# compute loss_2
return custom_loss
где "current_epoch" - переменная Keras, обновленная с помощью обратного вызова:
current_epoch = K.variable(0.)
model.compile(optimizer=opt, loss=loss_wrapper(5, current_epoch),
metrics=...)
class NewCallback(Callback):
def __init__(self, current_epoch):
self.current_epoch = current_epoch
def on_epoch_end(self, epoch, logs={}):
K.set_value(self.current_epoch, epoch)
Можно существенно превратить код Python в композиции внутренних функций, чтобы потеря работала следующим образом:
def loss_wrapper(t_change, current_epoch):
def custom_loss(y_true, y_pred):
# compute loss_1 and loss_2
bool_case_1=K.less(current_epoch,t_change)
num_case_1=K.cast(bool_case_1,"float32")
loss = (num_case_1)*loss_1 + (1-num_case_1)*loss_2
return loss
return custom_loss
it works.
Меня не устраивают эти хаки, и я удивляюсь, возможно ли установить model.loss
в обратном вызове без повторной компиляции model.compile(...)
после (с тех пор состояния оптимизатора сбрасываются) и просто перекомпилировать model.loss
?