def compute_dev_loss(self): loss_builder = LossBuilder() trg_words_cnt = 0 for src, trg in zip(self.dev_src, self.dev_trg): dy.renew_cg() standard_loss = self.model.calc_loss(src, trg) loss_builder.add_loss("loss", standard_loss) trg_words_cnt += self.logger.count_trg_words(trg) loss_builder.compute() return trg_words_cnt, LossScore(loss_builder.sum() / trg_words_cnt)
def training_step(self, src, trg): """ Performs forward pass, backward pass, parameter update for the given minibatch """ loss_builder = LossBuilder() standard_loss = self.model.calc_loss(src, trg, self.loss_calculator) if standard_loss.__class__ == LossBuilder: loss = None for loss_name, loss_expr in standard_loss.loss_nodes: loss_builder.add_loss(loss_name, loss_expr) loss = loss_expr if not loss else loss + loss_expr standard_loss = loss else: loss_builder.add_loss("loss", standard_loss) additional_loss = self.model.calc_additional_loss( dy.nobackprop(-standard_loss)) if additional_loss != None: loss_builder.add_loss("additional_loss", additional_loss) loss_value = loss_builder.compute() self.logger.update_epoch_loss(src, trg, loss_builder) self.logger.report_train_process() return loss_value
def one_epoch(self, update_weights=True): """ :param update_weights: Whether to perform backward pass & update weights (useful for debugging) """ self.logger.new_epoch() if self.args["reload_command"] is not None: self._augment_data_next_epoch() self.model.set_train(update_weights) order = list(range(0, len(self.train_src))) np.random.shuffle(order) for batch_num in order: src = self.train_src[batch_num] trg = self.train_trg[batch_num] # Loss calculation dy.renew_cg() loss_builder = LossBuilder() standard_loss = self.model.calc_loss(src, trg) if standard_loss.__class__ == LossBuilder: loss = None for loss_name, loss_expr in standard_loss.loss_nodes: loss_builder.add_loss(loss_name, loss_expr) loss = loss_expr if not loss else loss + loss_expr standard_loss = loss else: loss_builder.add_loss("loss", standard_loss) additional_loss = self.model.calc_additional_loss( dy.nobackprop(-standard_loss)) if additional_loss != None: loss_builder.add_loss("additional_loss", additional_loss) # Log the loss sum loss_value = loss_builder.compute() self.logger.update_epoch_loss(src, trg, loss_builder) if update_weights: loss_value.backward() self.trainer.update() # Devel reporting self.logger.report_train_process() if self.logger.should_report_dev(): self.dev_evaluation() self.model.new_epoch()
def training_step(self, src, trg): """ Performs forward pass, backward pass, parameter update for the given minibatch """ loss_builder = LossBuilder() standard_loss = self.model.calc_loss(src, trg, self.loss_calculator) additional_loss = self.model.calc_additional_loss(standard_loss) loss_builder.add_loss("standard_loss", standard_loss) loss_builder.add_loss("additional_loss", additional_loss) loss_value = loss_builder.compute() self.logger.update_epoch_loss(src, trg, loss_builder.get_loss_stats()) self.logger.report_train_process() return loss_value