Beispiel #1
0
def main():
    start_time = time()
    net = Net().to(setting.device)
    net.train()
    print('The modle has been initialized.')
    # define loss and optimizer
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)
    train_dataloader = data_preprocess.get_train_dataloader()
    for epoch in tqdm(range(num_epochs)):
        start = time()
        # for train accuracy
        # total = setting.train_img_nums
        # correct = 0
        for batch_idx, (imgs, labels) in enumerate(train_dataloader):
            # imgs = Variable(imgs)
            # label = Variable(labels)
            imgs, labels = imgs.to(setting.device), labels.to(setting.device)
            labels = labels.long()
            labels_ohe_predict = net(imgs)

            loss = 0
            for i in range(setting.char_num):
                one_label = labels[:, i * setting.pool_length:(i + 1) *
                                   setting.pool_length]
                one_class = one_label.argmax(dim=1)
                one_predict_label = labels_ohe_predict[:,
                                                       i * setting.pool_length:
                                                       (i + 1) *
                                                       setting.pool_length]
                one_loss = criterion(one_predict_label, one_class)
                loss += one_loss
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

            # for single in range(labels_ohe_predict.shape[0]):

            #     single_labels_ohe_predict = labels_ohe_predict[single, :]

            #     predict_label = ''
            #     # get predict_label
            #     for slice in range(setting.char_num):
            #         char = ohe.num2char[np.argmax(
            #             single_labels_ohe_predict[slice*setting.pool_length:(slice+1)*setting.pool_length].cpu().data.numpy())]
            #         predict_label += char
            #     # get true label
            #     true_label = ohe.decode(labels[single, :].cpu().numpy())
            #     if predict_label == true_label:
            #         correct += 1
        end = time()
        print('epoch: {}, time: {:.2f}s   loss: {:.04}'.format(
            epoch, end - start, loss.item()))
        # print('epoch: {}, time: {:.2f}s   loss: {:.04}  accuracy: {}/{} -- {:.4f}'.format(
        #     epoch, end-start, loss.item(), correct, total, correct/total))

    torch.save(net.state_dict(), './model.pt')
    finnal_time = time()
    print('End at {}, cost {:.0f}s'.format(finnal_time,
                                           finnal_time - start_time))
def train(loaders, save_path):
    """returns trained model"""
    # Initialize custom defined cnn
    model = Net()
    use_cuda = torch.cuda.is_available()
    if use_cuda:
        model.cuda()

    # cross entropy loss for classification task
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.Adam(model.parameters(), lr=config.lr)

    # initialize tracker for minimum validation loss
    valid_loss_min = np.Inf

    n_epochs = config.n_epochs
    for epoch in range(1, n_epochs + 1):
        # initialize variables to monitor training and validation loss
        train_loss = 0.0
        valid_loss = 0.0

        model.train()
        for batch_idx, (data, target) in enumerate(loaders['train']):
            # move to GPU
            if use_cuda:
                data, target = data.cuda(), target.cuda()
            optimizer.zero_grad()
            output = model(data)
            loss = criterion(output, target)
            loss.backward()
            optimizer.step()

            # average training loss
            train_loss += (1 / (batch_idx + 1)) * (loss.data - train_loss)

        # vaidation
        model.eval()
        for batch_idx, (data, target) in enumerate(loaders['valid']):
            # move to GPU
            if use_cuda:
                data, target = data.cuda(), target.cuda()
            ## update the average validation loss
            output = model(data)
            loss = criterion(output, target)
            valid_loss += (1 / (batch_idx + 1)) * (loss.data - valid_loss)

        # print training/validation statistics
        print('Epoch: {} \tTraining Loss: {:.6f} \tValidation Loss: {:.6f}'.
              format(epoch, train_loss, valid_loss))

        # save the model if validation loss has decreased
        if valid_loss <= valid_loss_min:
            torch.save(model.state_dict(), save_path)

            # Updating the validation loss minimum
            valid_loss_min = valid_loss

    # return trained model
    return model
Beispiel #3
0
                        help='whether to use dropout in network')
    parser.add_argument('--epochs', default=20, help='Number of Epochs')
    parser.add_argument('--lr', default=0.01, help='Default LR set to one')
    return parser.parse_args()


if __name__ == '__main__':
    args = parse()

    # is cuda available?
    use_cuda = not args.no_cuda and torch.cuda.is_available()
    device = torch.device("cuda" if use_cuda else "cpu")

    # load the data
    train_loader, test_loader = LoadData().load_data()

    model = Net(dropout=args.dropout).to(device)
    logging.debug("Model Summary {}".format(
        summary(model, input_size=(3, 32, 32))))

    model = Net().to(device)
    optimizer = optim.SGD(model.parameters(),
                          lr=0.01,
                          momentum=0.9,
                          nesterov=False)
    # scheduler = StepLR(optimizer, step_size=8, gamma=0.1)
    for epoch in range(args.epochs):
        # print('Epoch:', epoch+1,'LR:', scheduler.get_lr()[0])
        model.train(model, device, train_loader, optimizer)
        model.test(model, device, test_loader)