Как тренировать сеть Pytorch - PullRequest
0 голосов
/ 09 мая 2018

Я использую эту реализацию Segnet в Pytorch с предварительно подготовленными значениями, которые я нашел для сегментации объектов, и она отлично работает. Теперь я хочу возобновить обучение по имеющимся у меня значениям, используя новый набор данных с похожими изображениями. Как я могу это сделать?

Полагаю, мне нужно использовать файл train.py, найденный в репозитории, но я не знаю, что написать, чтобы заменить комментарий "fill the batch". Вот та часть кода:

def train(epoch):
    model.train()

    # update learning rate
    lr = args.lr * (0.1 ** (epoch // 30))
    for param_group in optimizer.param_groups:
        param_group['lr'] = lr

    # define a weighted loss (0 weight for 0 label)
    weights_list = [0]+[1 for i in range(17)]
    weights = np.asarray(weights_list)
    weigthtorch = torch.Tensor(weights_list)
    if(USE_CUDA):
        loss = nn.CrossEntropyLoss(weight=weigthtorch).cuda()
    else:
        loss = nn.CrossEntropyLoss(weight=weigthtorch)


    total_loss = 0

    # iteration over the batches
    batches = []
    for batch_idx,batch_files in enumerate(tqdm(batches)):

        # containers
        batch = np.zeros((args.batch_size,input_nbr, imsize, imsize), dtype=float)
        batch_labels = np.zeros((args.batch_size,imsize, imsize), dtype=int)

        # fill the batch
        # ... 
        # What should I write here?

        batch_th = Variable(torch.Tensor(batch))
        target_th = Variable(torch.LongTensor(batch_labels))

        if USE_CUDA:
            batch_th =batch_th.cuda()
            target_th = target_th.cuda()

        # initilize gradients
        optimizer.zero_grad()

        # predictions
        output = model(batch_th)

        # Loss
        output = output.view(output.size(0),output.size(1), -1)
        output = torch.transpose(output,1,2).contiguous()
        output = output.view(-1,output.size(2))
        target = target.view(-1)

        l_ = loss(output.cuda(), target)
        total_loss += l_.cpu().data.numpy()
        l_.cuda()
        l_.backward()
        optimizer.step()

return total_loss/len(files)

1 Ответ

0 голосов
/ 09 мая 2018

Если бы мне пришлось догадываться, он, вероятно, сделал несколько фидеров Dataloader, которые расширили класс Pytorch Dataloader. Увидеть https://pytorch.org/tutorials/beginner/data_loading_tutorial.html

В нижней части страницы вы можете увидеть пример, в котором они зацикливаются на загрузчике данных

для i_batch, sample_batched в перечислении (загрузчик данных):

Например, для изображений:

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

for batch_idx, (inputs, targets) in enumerate(trainloader):
    # Using the pytorch data loader the inputs and targets are given 
    # automatically
    inputs, targets = inputs.cuda(), targets.cuda()
    optimizer.zero_grad()
    inputs, targets = Variable(inputs), Variable(targets)

Как именно автор загружает свои файлы, я не знаю. Вы можете выполнить процедуру с: https://pytorch.org/tutorials/beginner/data_loading_tutorial.html, чтобы создать собственный загрузчик данных.

...