示例#1
0
def test_loop_fn(loader,
                 model,
                 criterion,
                 device,
                 epoch,
                 decoder,
                 alphabet):
    running_loss = 0.0
    total_words = 0
    cumulative_wer = 0
    iteration = 0

    model.eval()
    with torch.no_grad():
        for inputs, input_lengths, labels, label_lengths in loader:
            out = model(inputs)
            loss = criterion(out, labels, input_lengths, label_lengths)

            iteration += 1
            running_loss += loss.item()
            wers, n_words = compute_wer(out, labels, decoder, alphabet, print_output=True)
            cumulative_wer += wers
            total_words += n_words

        avg_loss = running_loss / iteration
        avg_wer = cumulative_wer / total_words
        logging.info('[Val][%s] Loss=%.5f WER=%.3f Time=%s',
                     epoch, avg_loss, avg_wer, time.asctime())
        return avg_loss
示例#2
0
    def _shared_eval(self, batch, batch_idx):
        # prepare decode
        images, labels, image_padding_mask, lengths = batch

        # decode
        pred = self.decode(images, self.beam_width, image_padding_mask)
        tgt, tgt_len = labels[:, 1:], lengths - 2

        # convert to strings
        predicts = self.ctc_string_tf(pred)
        groundtruth = self.string_tf(tgt, tgt_len)

        cer_distances, num_chars = compute_cer(predicts,
                                               groundtruth,
                                               indistinguish=False)
        wer_distances, num_words = compute_wer(predicts,
                                               groundtruth,
                                               indistinguish=False)

        return {
            'cer_distances': cer_distances,
            'num_chars': num_chars,
            'wer_distances': wer_distances,
            'num_words': num_words
        }
示例#3
0
def train_loop_fn(loader,
                  optimizer,
                  model,
                  criterion,
                  device,
                  epoch,
                  decoder,
                  alphabet,
                  log_steps):
    running_loss = 0.0
    iteration = 0
    model.train()
    for step, (inputs, input_lengths, labels, label_lengths) in enumerate(loader, 1):
        # zero the parameter gradients
        optimizer.zero_grad()
        out = model(inputs)

        loss = criterion(out, labels, input_lengths, label_lengths)
        loss_value = loss.item()
        # Check to ensure valid loss was calculated
        valid_loss, error = check_loss(loss, loss_value)
        if valid_loss:
            loss.backward()
            torch.nn.utils.clip_grad_norm_(model.parameters(), 400)
            optimizer.step()
        else:
            logging.error(error)
            logging.info('Skipping grad update')
            loss_value = 0

        iteration += 1
        running_loss += loss_value
        if step % log_steps == 0:
            wers, n_words = compute_wer(out, labels, decoder, alphabet, print_output=True)
            batch_wer = wers / n_words
            logging.info('Batch WER: %.3f', batch_wer)

    avg_loss = running_loss / iteration
    logging.info('[Train][%s] Loss=%.5f Time=%s',
                 epoch, avg_loss, time.asctime())