Я хотел бы проверить значения self.losses['RMSE']
, self.loss['CrossEntropy']
и self.loss['OtherLoss']
в конце каждой эпохи.В настоящее время я могу проверить только общий убыток self.loss['total']
.
def train_test(self):
def custom_loss(y_true, y_pred):
## (...) Calculate several losses inside this function
self.losses['total'] = self.losses['RMSE'] + self.losses['CrossEntropy'] + self.losses['OtherLoss']
return self.losses['total']
## (...) Generate Deep learning model & Read Inputs
logits = keras.layers.Dense(365, activation=keras.activations.softmax)(concat)
self.model = keras.Model(inputs=[...], outputs=logits)
self.model.compile(optimizer=keras.optimizers.Adam(0.001),
loss=custom_loss)
self.history = self.model.fit_generator(
generator=self.train_data,
steps_per_epoch=train_data_size//FLAGS.batch_size,
epochs=5,
callbacks=[CallbackA(self.losses)])
class TrackTestDataPerformanceCallback(keras.callbacks.Callback):
def __init__(self, losses):
self.losses = losses
def on_epoch_end(self, epoch, logs={}):
for key in self.losses.keys()
print('Type of loss: {}, Value: {}'.format(key, K.eval(self.losses[key])))
Я передал self.loss
в функцию обратного вызова CallbackA
, чтобы напечатать значения суб-потерь в конце каждой эпохи.Тем не менее, он выдает сообщение об ошибке следующим образом:
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'input_3' with dtype float and shape [?,5]
[[Node: input_3 = Placeholder[dtype=DT_FLOAT, shape=[?,5], _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]
[[Node: loss/dense_3_loss/survive_rates/while/LoopCond/_881 = _HostRecv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_360_loss/dense_3_loss/survive_rates/while/LoopCond", tensor_type=DT_BOOL, _device="/job:localhost/replica:0/task:0/device:CPU:0"](^_clooploss/dense_3_loss/survive_rates/while/strided_slice_4/stack_2/_837)]]
Я мог бы снова передать данные поезда в функцию обратного вызова и самому предсказать, чтобы отслеживать значения каждой потери.Но я думаю, что могло бы быть лучшее решение, которое я еще не знаю.
Резюме: Как отслеживать несколько значений потерь в пользовательской функции потерь после каждой эпохи?
Ограничения: Чтобы уменьшить некоторые вычислительные затраты, я бынравится управлять несколькими потерями в функции custom_loss
на данный момент.Но если мне нужно обернуть каждую потерю в каждую функцию, это нормально.