Пример #1
0
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

trainset = torchvision.datasets.CIFAR10(root='../../../',
                                        train=True,
                                        download=False,
                                        transform=transform)
train_loader = torch.utils.data.DataLoader(trainset,
                                           batch_size=batch_size_train,
                                           shuffle=True,
                                           num_workers=2)

use_cuda = False
device = torch.device("cuda" if use_cuda else "cpu")

network = Net().to(device)
optimizer = optim.SGD(network.parameters(),
                      lr=learning_rate,
                      momentum=momentum)
network_path = 'initial_cifar_model.pth'

network_state_dict = torch.load('initial_cifar_model.pth',
                                map_location={'cuda:0': 'cpu'})
network.load_state_dict(network_state_dict)


def train(epoch):
    network.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data = data.to(device)
        target = target.to(device)
Пример #2
0
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

testset = torchvision.datasets.CIFAR10(root='../../../', train=False,
                                       download=False, transform=transform)
test_loader = torch.utils.data.DataLoader(testset, batch_size= 1000,
                                         shuffle=False, num_workers=2)

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')



network = Net().to(device)
network_state_dict = torch.load('initial_cifar_model.pth', map_location={'cuda:0': 'cpu'})
network.load_state_dict(network_state_dict)

correct = 0
total = 0

with torch.no_grad():
    for data in test_loader:
        images, labels = data
        images = images.to(device)
        labels = labels.to(device)
        outputs = network(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()
Пример #3
0
momentum = 0.9
log_interval = 10

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root='../../../', train=True,
                                        download=False, transform=transform)
train_loader = torch.utils.data.DataLoader(trainset, batch_size=batch_size_train,
                                          shuffle=True, num_workers=2)




distilled_network = Net().to(device)
optimizer = optim.SGD(distilled_network.parameters(), lr=learning_rate,
                      momentum=momentum)
distilled_path = 'distilled_cifar_model.pth'


network = Net().to(device) 
network_state_dict = torch.load('initial_cifar_model.pth', map_location={'cuda:0': 'cpu'})
network.load_state_dict(network_state_dict)



distilled_network_state_dict = torch.load('distilled_cifar_model.pth', map_location={'cuda:0': 'cpu'})
distilled_network.load_state_dict(distilled_network_state_dict)

def softmax_and_cross_entropy(logits, labels):
Пример #4
0
def train(options):
    """
     Обучаем нашу модель, которую нужно реализовать в файле cifar_model.py
    :param options: 
    :return: 
    """
    base_lr = 0.001  # задаем базовый коэффициент обучения
    # список классов  cifar 10
    classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse',
               'ship', 'truck')

    # иниициализация writer для записи в tensorboard
    writer = SummaryWriter(log_dir=options.log)

    #
    # тут можно сделать аугментацию
    # трансформации, шум ...
    # https://www.programcreek.com/python/example/104832/torchvision.transforms.Compose
    transform = transforms.Compose([
        transforms.RandomCrop(32, padding=4),
        transforms.RandomHorizontalFlip(),
        transforms.ColorJitter(),
        transforms.RandomRotation,
        transforms.ToTensor(),
        transforms.Normalize((0.4914, 0.4822, 0.4465),
                             (0.2023, 0.1994, 0.2010)),  #нормализация данных
    ])

    transform_test = transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize((0.4914, 0.4822, 0.4465),
                             (0.2023, 0.1994, 0.2010)),
    ])

    #
    # Загружаем данные, если данных еще нет, то нужно указать флаг download=True
    # torchvision реализует Dataset для CIFAR, MNIST, ImageNet...
    print("Loading data....")
    trainset = cifar.CIFAR10(options.input, train=True, transform=transform)

    # теперь можно использовать DataLoader для доступа к данным
    # Dataset, shuffle = True - доступ рандомный
    # можно загружать данные в несколько потоков, если скорость загрузки
    # меньше чем скорость обновления сети
    trainloader = DataLoader(trainset,
                             batch_size=options.bs,
                             shuffle=True,
                             num_workers=2)

    # данные для теста
    testset = cifar.CIFAR10(options.input,
                            train=False,
                            transform=transform_test)
    testloader = DataLoader(testset,
                            batch_size=options.bs,
                            shuffle=False,
                            num_workers=2)

    # Создаем модель, нужно сделать иплементацию
    print("Creating model...")
    net = Net().cuda()

    # Критерий кросс энтропия
    criterion = nn.CrossEntropyLoss().cuda()
    # тут создаем оптимайзер, который нужен
    optimizer = optim.Adam(net.parameters(), lr=0.001, weight_decay=1e-4)  #
    #optimizer = optim.SGD(net.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4)

    start_from_epoch = 0
    # Если указан чекпойнт то загружаем сеть
    if options.checkpoint is not None and os.path.exists(options.checkpoint):
        cp_dic = torch.load(options.checkpoint)
        net.load_state_dict(cp_dic['net'])
        optimizer.load_state_dict(cp_dic['optimizer'])
        start_from_epoch = cp_dic['epoch']

    print("Start train....")
    for epoch in range(start_from_epoch, options.epoch):
        train_loss = 0.0

        # делаем что то с коэффициентом обучения
        epoch_lr = adjust_learning_rate(optimizer, epoch, base_lr)

        print('Train epoch: ', epoch)
        net.train(True)
        for i, data in tqdm(enumerate(trainloader, 0), total=len(trainloader)):
            # получаем входы из даталоадера
            inputs, labels = data

            # оборачиваем данные в Variable
            inputs, labels = Variable(inputs).cuda(), Variable(labels).cuda()

            # обнуляем градиенты
            optimizer.zero_grad()

            # forward + backward + optimize
            outputs = net(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()

            # печатаем статистику по итерации в tensorboard
            train_loss += loss.data[0]
            #
            writer.add_scalar('loss/iter_train', loss.data[0],
                              epoch * len(trainloader) + i)

        train_loss /= len(trainloader)

        # тестируем модель после эпохи, что бы понять что у нас еще все хорошо
        net.eval()
        test_loss = 0.0
        class_correct = list(0. for i in range(10))
        class_total = list(0. for i in range(10))
        print('Test epoch: ', epoch)
        for i, data in tqdm(enumerate(testloader, 0), total=len(testloader)):
            inputs, labels = data

            # получаем переменные Variable
            inputs, labels = Variable(inputs, volatile=True).cuda(), Variable(
                labels, volatile=True).cuda()
            outputs = net(inputs)

            # считаем ошибку
            loss = criterion(outputs, labels)
            test_loss += loss.data[0]
            # считаем какие классы мы предсказали и сохраняем для
            # последующего расчета accuracy
            _, predicted = torch.max(outputs.data, 1)
            c = (predicted == labels.data).squeeze()
            for i in range(outputs.size(0)):
                label = labels.data[i]
                class_correct[label] += c[i]
                class_total[label] += 1

        test_loss /= len(testloader)
        # расчитываем accuracy
        accuracy = {}
        avg_accuracy = 0
        for i in range(10):
            accuracy[classes[i]] = 100 * class_correct[i] / class_total[i]
            avg_accuracy += accuracy[classes[i]]

        print("train:", train_loss, "test:", test_loss)
        # пишем всю статистику в tensorboard
        writer.add_scalars('loss/avg_epoch_error', {
            'train': train_loss,
            'test': test_loss
        }, epoch)
        writer.add_scalars('loss/class_accuracy', accuracy, epoch)
        writer.add_scalar('loss/avg_accuracy', avg_accuracy / 10, epoch)

        # выводим коэффициент обучения на эпохе
        writer.add_scalar('loss/epoch_lr', epoch_lr, epoch)

        # сохраняем модель каждые 2 итерации
        if epoch % 2 == 0:
            torch.save(
                {
                    'epoch': epoch + 1,
                    'net': net.state_dict(),
                    'optimizer': optimizer.state_dict()
                }, options.model + '_chekpoint_%03d.pth' % epoch)

    # сохраняем финальную модель
    torch.save({
        'net': net.state_dict(),
        'optimizer': optimizer.state_dict()
    }, options.model + '.pth')
Пример #5
0
Файл: eval.py Проект: alloky/ml
def eval(options):
    classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse',
               'ship', 'truck')
    class_correct = list(0. for i in range(10))
    class_total = list(0. for i in range(10))

    # Создаем модель, нужно сделать иплементацию
    print("Creating model...")
    net = Net().cuda()
    net.eval()
    # Критерий кросс энтропия проверим, что у нас вск сходится
    criterion = nn.CrossEntropyLoss().cuda()

    # загружаем сеть
    cp_dic = torch.load(options.model)
    net.load_state_dict(cp_dic)

    transform_test = transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize((0.4914, 0.4822, 0.4465),
                             (0.2023, 0.1994, 0.2010)),
    ])

    # данные для теста
    testset = cifar.CIFAR10(options.input,
                            train=False,
                            transform=transform_test)
    testloader = DataLoader(testset,
                            batch_size=16,
                            shuffle=False,
                            num_workers=2)

    test_loss = 0
    print('Test model: ')

    ofile = open(options.out, 'w')
    print("id,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9", file=ofile)

    for bid, data in tqdm(enumerate(testloader, 0), total=len(testloader)):
        inputs, labels = data

        # получаем переменные Variable
        inputs, labels = Variable(inputs, volatile=True).cuda(), Variable(
            labels, volatile=True).cuda()
        outputs = net(inputs)

        # считаем ошибку
        loss = criterion(outputs, labels)
        test_loss += loss.data[0]
        # считаем какие классы мы предсказали и сохраняем для
        # последующего расчета accuracy
        _, predicted = torch.max(outputs.data, 1)
        c = (predicted == labels.data).squeeze()
        for i in range(outputs.size(0)):
            label = labels.data[i]
            class_correct[label] += c[i]
            class_total[label] += 1

        # печатаем для каждого класса вероятности
        probs = softmax(outputs)
        for sid, sample in enumerate(probs.data):
            s = '%d' % ((bid * 16) + sid)
            for prob in sample:
                s += ',%f' % prob
            print(s, file=ofile)

    test_loss /= len(testloader)
    # расчитываем accuracy
    accuracy = {}
    avg_accuracy = 0
    for i in range(10):
        accuracy[classes[i]] = 100 * class_correct[i] / class_total[i]
        avg_accuracy += accuracy[classes[i]]

    print("Final cross entropy loss: %0.5f" % test_loss,
          "Final accuracy: %0.3f" % (avg_accuracy / 10))