Exemplo n.º 1
0
                              longest_sequence=85,
                              shortest_sequence=55)

print('Building dataloaders..')
eval_dataloader = data.DataLoader(dataset, batch_size=batch_size)

model = RNN(num_features, hidden_dimension, num_classes,
            num_layers=2).to(device)
checkpoint = torch.load(checkpoint_path)
model.load_state_dict(checkpoint['model_state_dict'])

true_positives = []
false_positives = []
temp = np.ones((85, 128))

model.eval()
true_positives = []
false_positives = []
true_negatives = []
false_negatives = []
for batch_idx, val_data in enumerate(eval_dataloader):
    gt_piano_roll = val_data['piano_roll'].permute(
        0, 2, 1).squeeze(0).detach().numpy()
    sequence = val_data['sequence'].permute(1, 0, 2)
    seq_len = val_data['sequence_length']
    # gt = gt_piano_roll.detach().numpy()

    # -----------------------------------------------------------------------------------

    h = torch.zeros([1, 128])
    c = torch.zeros([1, 128])
Exemplo n.º 2
0
    # Create an instance of the model with given hyperparameters
    rnn = RNN(dataset.vocab_size,
              hidden_size=MODEL_HIDDEN_SIZE,
              embedding_size=MODEL_EMBEDDING_SIZE,
              embeddings_dropout=MODEL_EMBEDDINGS_DROPOUT,
              lstm_dropout=MODEL_LSTM_DROPOUT,
              num_decode_layers=MODEL_NUM_HIDDEN_LAYERS)
else:
    rnn = MultiTaskRNN(dataset.vocab_size,
                       dataset.tag_vocab_size,
                       hidden_size=MODEL_HIDDEN_SIZE_MULTI,
                       embedding_size=MODEL_EMBEDDING_SIZE_MULTI,
                       embeddings_dropout=MODEL_EMBEDDINGS_DROPOUT_MULTI,
                       lstm_dropout=MODEL_LSTM_DROPOUT_MULTI,
                       num_decode_layers=MODEL_NUM_HIDDEN_LAYERS_MULTI)
rnn.eval()

# Load state dict
try:
    if USE_MULTI_TASK:
        state_dict_path = STATE_DICT_PATH_MULTI
    else:
        state_dict_path = STATE_DICT_PATH

    state_dict, epoch, batch, best_loss = load_state_dict(
        device, state_dict_path)
    rnn.load_state_dict(state_dict)

    print("Successfully loaded model state from {}.".format(state_dict_path))
    print("Loaded model at epoch {}, batch {}.".format(epoch, batch))
    print("Best recorded loss was {}.".format(best_loss))
Exemplo n.º 3
0
def predict(cfg, model_path_c1, model_path_c2, model_path_c3, model_path_c4,
            loader, device, save_path):
    print(f'Saving predictions @ {save_path}')
    model_c1 = RNN(cfg.model_type, cfg.input_dim, cfg.hidden_dim, cfg.n_layers,
                   cfg.drop_p, cfg.output_dim, cfg.bi_dir)
    model_c2 = RNN(cfg.model_type, cfg.input_dim, cfg.hidden_dim, cfg.n_layers,
                   cfg.drop_p, cfg.output_dim, cfg.bi_dir)
    model_c3 = RNN(cfg.model_type, cfg.input_dim, cfg.hidden_dim, cfg.n_layers,
                   cfg.drop_p, cfg.output_dim, cfg.bi_dir)
    model_c4 = RNN(cfg.model_type, cfg.input_dim, cfg.hidden_dim, cfg.n_layers,
                   cfg.drop_p, cfg.output_dim, cfg.bi_dir)
    model_c1 = model_c1.to(device)
    model_c2 = model_c2.to(device)
    model_c3 = model_c3.to(device)
    model_c4 = model_c4.to(device)

    # load the model
    model_c1.load_state_dict(torch.load(model_path_c1))
    model_c2.load_state_dict(torch.load(model_path_c2))
    model_c3.load_state_dict(torch.load(model_path_c3))
    model_c4.load_state_dict(torch.load(model_path_c4))

    # just to be sure
    model_c1.eval()
    model_c2.eval()
    model_c3.eval()
    model_c4.eval()

    predictions = {
        'Object': [],
        'Sequence': [],
    }

    for c in range(cfg.output_dim):
        predictions[f'{cfg.task}_prob_{c}'] = []

    for batch in loader:
        inputs = batch['inputs'].to(device)

        with torch.set_grad_enabled(False):
            # (B, T, D)
            outputs_c1, hiddens = model_c1(inputs[:, 0, :, :])
            outputs_c2, hiddens = model_c2(inputs[:, 1, :, :])
            outputs_c3, hiddens = model_c3(inputs[:, 2, :, :])
            outputs_c4, hiddens = model_c4(inputs[:, 3, :, :])

            outputs = outputs_c1 + outputs_c2 + outputs_c3 + outputs_c4

            _, preds = torch.max(outputs, 1)
            softmaxed = torch.nn.functional.softmax(outputs, dim=-1)

        for i in range(len(batch['paths'])):
            sequence = pathlib.Path(batch['paths'][i]).stem
            predictions['Object'].append(batch['containers'][i])
            predictions['Sequence'].append(sequence)
            for c in range(cfg.output_dim):
                predictions[f'{cfg.task}_prob_{c}'].append(softmaxed[i,
                                                                     c].item())

    predictions_dataset = pd.DataFrame.from_dict(predictions).sort_values(
        ['Object', 'Sequence'])
    predictions_dataset.to_csv(save_path, index=False)
    # returning the dataset because it will be useful for test-time prediction averaging
    return predictions_dataset
print_every = 50

# training interface
step = 0
tracker = {'NLL': []}
start_time = time.time()
for ep in range(epoch):
    # learning rate decay
    if ep >= 10 and ep % 2 == 0:
        learning_rate = learning_rate * 0.5
        for param_group in optimizer.param_groups:
            param_group['lr'] = learning_rate

    for split in splits:
        dataloader = dataloaders[split]
        model.train() if split == 'train' else model.eval()
        totals = {'NLL': 0., 'words': 0}

        for itr, (_, dec_inputs, targets, lengths) in enumerate(dataloader):
            bsize = dec_inputs.size(0)
            dec_inputs = dec_inputs.to(device)
            targets = targets.to(device)
            lengths = lengths.to(device)

            # forward
            logp = model(dec_inputs, lengths)

            # calculate loss
            NLL_loss = NLL(logp, targets, lengths + 1)
            loss = NLL_loss / bsize
Exemplo n.º 5
0
def train(cfg, datasets, dataloaders, device, save_model_path_c1,
          save_model_path_c2, save_model_path_c3, save_model_path_c4):
    model_c1 = RNN(cfg.model_type, cfg.input_dim, cfg.hidden_dim, cfg.n_layers,
                   cfg.drop_p, cfg.output_dim, cfg.bi_dir)
    model_c2 = RNN(cfg.model_type, cfg.input_dim, cfg.hidden_dim, cfg.n_layers,
                   cfg.drop_p, cfg.output_dim, cfg.bi_dir)
    model_c3 = RNN(cfg.model_type, cfg.input_dim, cfg.hidden_dim, cfg.n_layers,
                   cfg.drop_p, cfg.output_dim, cfg.bi_dir)
    model_c4 = RNN(cfg.model_type, cfg.input_dim, cfg.hidden_dim, cfg.n_layers,
                   cfg.drop_p, cfg.output_dim, cfg.bi_dir)

    model_c1 = model_c1.to(device)
    model_c2 = model_c2.to(device)
    model_c3 = model_c3.to(device)
    model_c4 = model_c4.to(device)

    params = list(model_c1.parameters()) + list(model_c2.parameters()) + list(
        model_c3.parameters()) + list(model_c4.parameters())

    optimizer = torch.optim.Adam(params, lr=1e-4)
    criterion = torch.nn.CrossEntropyLoss()
    # scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)

    best_metric = 0.0
    best_epoch = 0
    best_model_wts_c1 = copy.deepcopy(model_c1.state_dict())
    best_model_wts_c2 = copy.deepcopy(model_c2.state_dict())
    best_model_wts_c3 = copy.deepcopy(model_c3.state_dict())
    best_model_wts_c4 = copy.deepcopy(model_c4.state_dict())

    for epoch in range(cfg.num_epochs):
        for phase in ['train', 'valid']:
            if phase == 'train':
                model_c1.train()  # Set model to training mode
                model_c2.train()  # Set model to training mode
                model_c3.train()  # Set model to training mode
                model_c4.train()  # Set model to training mode
            else:
                model_c1.eval()  # Set model to training mode
                model_c2.eval()  # Set model to training mode
                model_c3.eval()  # Set model to training mode
                model_c4.eval()  # Set model to training mode

            running_loss = 0.0
            # running_corrects = 0
            y_pred = []
            y_true = []

            # Iterate over data.
            for batch in dataloaders[phase]:
                # (B, num_cam, T, D)
                inputs = batch['inputs'].to(device)
                targets = batch['targets'][cfg.task].to(device)

                # zero the parameter gradients
                optimizer.zero_grad()

                # forward
                # track history if only in train
                with torch.set_grad_enabled(phase == 'train'):
                    # (B, T, D)
                    outputs_c1, hiddens = model_c1(inputs[:, 0, :, :])
                    outputs_c2, hiddens = model_c2(inputs[:, 1, :, :])
                    outputs_c3, hiddens = model_c3(inputs[:, 2, :, :])
                    outputs_c4, hiddens = model_c4(inputs[:, 3, :, :])

                    outputs = outputs_c1 + outputs_c2 + outputs_c3 + outputs_c4

                    _, preds = torch.max(outputs, 1)
                    loss = criterion(outputs, targets)

                    # backward + optimize only if in training phase
                    if phase == 'train':
                        loss.backward()
                        optimizer.step()

                # statistics
                running_loss += loss.item() * inputs.size(0)
                # running_corrects += torch.sum(preds == targets.data)
                y_pred.extend(preds.tolist())
                y_true.extend(targets.tolist())

            # if phase == 'train':
            #     scheduler.step()

            # epoch_acc = running_corrects.double() / len(datasets[phase])
            epoch_loss = running_loss / len(datasets[phase])
            f1_ep = f1_score(y_true, y_pred, average='weighted')
            precision_ep = precision_score(y_true, y_pred, average='weighted')
            recall_ep = recall_score(y_true, y_pred, average='weighted')
            accuracy_ep = accuracy_score(y_true, y_pred)

            # print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))
            print(
                f'({phase} @ {epoch+1}): L: {epoch_loss:3f}; A: {accuracy_ep:3f}; R: {recall_ep:3f}; '
                + f'P: {precision_ep:3f}; F1: {f1_ep:3f}')

            # deep copy the model
            if phase == 'valid' and f1_ep > best_metric:
                best_metric = f1_ep
                best_epoch = epoch
                best_model_wts_c1 = copy.deepcopy(model_c1.state_dict())
                best_model_wts_c2 = copy.deepcopy(model_c2.state_dict())
                best_model_wts_c3 = copy.deepcopy(model_c3.state_dict())
                best_model_wts_c4 = copy.deepcopy(model_c4.state_dict())

    print(f'Best val Metric {best_metric:3f} @ {best_epoch+1}\n')

    # load best model weights
    model_c1.load_state_dict(best_model_wts_c1)
    model_c2.load_state_dict(best_model_wts_c2)
    model_c3.load_state_dict(best_model_wts_c3)
    model_c4.load_state_dict(best_model_wts_c4)

    torch.save(model_c1.state_dict(), save_model_path_c1)
    torch.save(model_c2.state_dict(), save_model_path_c2)
    torch.save(model_c3.state_dict(), save_model_path_c3)
    torch.save(model_c4.state_dict(), save_model_path_c4)
    print(f'models are saved @ {save_model_path_c1}')
    return best_metric