示例#1
0
 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)
示例#2
0
    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
示例#3
0
    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()
示例#4
0
  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