Ejemplo n.º 1
0
def train():
    """
    Performs training and evaluation of ConvNet model.

    Implement training and evaluation of ConvNet model. Evaluate your model on the whole test set each eval_freq iterations.
    """

    ### DO NOT CHANGE SEEDS!
    # Set the random seeds for reproducibility
    np.random.seed(42)

    dataset = cifar10_utils.get_cifar10(DATA_DIR_DEFAULT)
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    a, b, c = dataset['train'].images.shape[1:]
    n_classes = dataset['train'].labels.shape[1]

    cnn = ConvNet(3, n_classes).to(device)
    optimizer = optim.Adam(cnn.parameters(), lr=FLAGS.learning_rate)
    crossentropy = nn.CrossEntropyLoss()

    n_test = dataset['test'].images.shape[0]

    for step in range(FLAGS.max_steps):
        input, labels = dataset['train'].next_batch(FLAGS.batch_size)
        labels = np.argmax(labels, axis=1)
        input, labels = torch.from_numpy(input).to(device), torch.from_numpy(
            labels).long().to(device)
        predictions = cnn.forward(input)

        loss = crossentropy(predictions, labels)
        # clean up old gradients
        cnn.zero_grad()
        loss.backward()
        optimizer.step()

        if (step == FLAGS.max_steps - 1 or step % FLAGS.eval_freq == 0):

            test_loss = []
            test_accuracy = []
            for i in range(0, n_test, FLAGS.batch_size):
                test_input, test_labels = dataset['test'].next_batch(
                    FLAGS.batch_size)
                test_input = torch.from_numpy(test_input).to(device)
                test_labels = torch.from_numpy(np.argmax(
                    test_labels, axis=1)).long().to(device)
                test_prediction = cnn.forward(test_input)
                test_loss.append(
                    crossentropy(test_prediction, test_labels).item())
                test_accuracy.append(accuracy(test_prediction, test_labels))

            sys.stdout = open(
                str(FLAGS.learning_rate) + '_' + str(FLAGS.max_steps) + '_' +
                str(FLAGS.batch_size) + '_' + str(FLAGS.batch_size) +
                'conv.txt', 'a')
            print("{},{:f},{:f}".format(step, np.mean(test_loss),
                                        np.mean(test_accuracy)))
def train():
    """
  Performs training and evaluation of ConvNet model. 

  TODO:
  Implement training and evaluation of ConvNet model. Evaluate your model on the whole test set each eval_freq iterations.
  """

    ### DO NOT CHANGE SEEDS!
    # Set the random seeds for reproducibility
    np.random.seed(42)

    # Load data
    cifar10 = cifar10_utils.get_cifar10(data_dir=FLAGS.data_dir,
                                        one_hot=False,
                                        validation_size=5000)
    train_set = cifar10['train']
    test_set = cifar10['test']
    val_set = cifar10['validation']

    # Initialize model
    n_channels = len(train_set.images[0].shape)
    n_classes = train_set.labels.max() + 1

    # set device
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    model = ConvNet(n_channels, n_classes)
    model = model.to(device)
    model = nn.DataParallel(model)

    cross_entropy = nn.CrossEntropyLoss()
    optimizer = optim.Adam(model.parameters(), lr=FLAGS.learning_rate)

    total_loss = 0
    losses = []

    val_acc = []
    train_acc = []
    for i in range(FLAGS.max_steps + 1):

        # prepare batch
        x, y = train_set.next_batch(FLAGS.batch_size)
        x, y = torch.tensor(x), torch.tensor(y, dtype=torch.long)
        x, y = x.to(device), y.to(device)

        # forward pass
        out = model(x)
        loss = cross_entropy(out, y)
        total_loss += loss.item()

        # keep track of training accuracy
        train_acc.append(accuracy(out, y))

        # backward pass
        model.zero_grad()
        loss.backward()
        optimizer.step()

        if i % FLAGS.eval_freq == 0 and i != 0:
            with torch.no_grad():
                val_inputs = test_set.images
                val_inputs = torch.tensor(val_inputs)
                val_inputs = val_inputs.to(device)

                pred = model(val_inputs)
                targ = torch.tensor(test_set.labels)
                targ = targ.to(device)

                acc = accuracy(pred, targ)

                losses.append(total_loss)
                val_acc.append(acc)

                print()
                print("- - - - - - - - - -")
                print('- STEPS:\t\t\t', i)
                print('- TRAIN ACC: \t\t\t', np.array(train_acc).mean())
                print('- VALIDATION ACC:\t\t', acc)
                print("- - - - - - - - - -")

                train_acc = []
                total_loss = 0

    print("Loss over time: \t", losses)
    print("Val acc over time: \t", val_acc)

    with open('cnn_data.dill', 'wb') as f:
        dill.dump({'train_loss': losses, 'val_acc': val_acc}, f)
Ejemplo n.º 3
0
def train():
    """
  Performs training and evaluation of ConvNet model.

  TODO:
  Implement training and evaluation of ConvNet model. Evaluate your model on the whole test set each eval_freq iterations.
  """

    ### DO NOT CHANGE SEEDS!
    # Set the random seeds for reproducibility
    np.random.seed(42)
    epoch_num = 3
    ########################
    # PUT YOUR CODE HERE  #
    #######################
    model = ConvNet(3, 10)

    #Obtain Dataset
    train_dataset = cifar10_utils.get_cifar10()['train']
    val_dataset = cifar10_utils.get_cifar10()['validation']
    test_dataset = cifar10_utils.get_cifar10()['test']

    train_loader = torch.utils.data.DataLoader(train_dataset,
                                               batch_size=BATCH_SIZE_DEFAULT,
                                               drop_last=True)

    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters())
    for epoch in range(epoch_num):
        model.train()
        losses = []
        accs = []
        for i_iter in range(
                int(train_dataset.num_examples / BATCH_SIZE_DEFAULT)):
            images, labels = train_dataset.next_batch(BATCH_SIZE_DEFAULT)
            images, labels = torch.tensor(images), torch.tensor(
                labels, dtype=torch.long)
            pred = model(images)
            labels = torch.argmax(labels, dim=1)
            loss = criterion(pred, labels)
            pred_result = torch.argmax(pred, dim=1)
            acc = accuracy(pred_result, labels)
            accs.append(acc)
            model.zero_grad()
            loss.backward()
            optimizer.step()
            losses.append(loss)
            if i_iter % 100 == 0:
                msg = 'Epoch:[{}/{}] Iter: [{}/{}], Loss: {: .6f}, ACC:[{: .6f}]'.format(
                    epoch, epoch_num, i_iter,
                    int(train_dataset.num_examples / BATCH_SIZE_DEFAULT),
                    sum(losses) / len(losses),
                    sum(accs) / len(accs))
                print(msg)
                with open('./log.txt', 'a') as f:
                    f.write(msg)
                    f.write('\n')
            msg_epoch = '--------Epoch: [{}/{}], Loss: {: .6f}, ACC:[{: .6f}]-------'.format(
                epoch, epoch_num,
                sum(losses) / len(losses),
                sum(accs) / len(accs))
            print(msg_epoch)
            with open('./log.txt', 'a') as f:
                f.write(msg)
                f.write('\n')