Как обучить модель CNN? - PullRequest
0 голосов
/ 26 июня 2019

При попытке обучить модель CNN я наткнулся на код, показанный ниже:

def train(n_epochs, loaders, model, optimizer, criterion):

    for epoch in range(1,n_epochs):
        train_loss = 0
        valid_loss = 0

        model.train()
        for i, (data,target) in enumerate(loaders['train']):

            # zero the parameter (weight) gradients
            optimizer.zero_grad()            
            # forward pass to get outputs
            output = model(data)            
            # calculate the loss
            loss = criterion(output, target)            
            # backward pass to calculate the parameter gradients
            loss.backward()            
            # update the parameters
            optimizer.step()

Может кто-нибудь сказать, почему используется второй цикл for? то есть; for i, (data,target) in enumerate(loaders['train']):

А почему используются optimizer.zero_grad() и optimizer.step()?

Ответы [ 2 ]

1 голос
/ 26 июня 2019
  • torch.utils.data.DataLoader пригодится, когда вам нужно подготовить пакеты данных (и, возможно, перемешивать их перед каждым запуском).

    data_train_loader = DataLoader(data_train, batch_size=64, shuffle=True)

    В приведенном выше коде первый for-loop выполняет итерацию по количеству эпох, в то время как второй цикл выполняет итерацию по обучающему набору данных, преобразованному в пакеты с помощью приведенного выше кода.Например:

    for batch_idx, samples in enumerate(data_train_loader):
        # samples will be a 64 x D dimensional tensor
        # batch_idx is each batch index
    

    Узнайте больше о torch.utils.data.DataLoader из здесь .

  • Optimizer.zero_gradient(): перед обратным проходом используйтеоптимизатор обнуляет все градиенты для тензоров, которые он будет обновлять (которые являются усваиваемыми весами модели)

  • optimizer.step(): мы обычно используем optimizer.step(), чтобы сделать градиентшаг спуска.Вызов функции шага в Оптимизаторе обновляет его параметры.

    Подробнее об этом можно узнать по здесь .

1 голос
/ 26 июня 2019

Оптимизатор используется в первую очередь для загрузки таких параметров (как это отсутствует в вашем коде):

optimizer = optim.Adam(model.parameters(), lr=0.001, momentum=0.9)

Этот код

loss = criterion(output, target)  

Используется для расчета потерь одной партии, где цели - это то, что вы получили из кортежа (data,target), а данные используются в качестве входных данных для модели, где мы получили output.

Этот шаг:

optimizer.zero_grad()

Обнулит все градиенты, найденные в оптимизаторе, что очень важно при инициализации.

часть

loss.backward()

Вычисляет градиенты, а optimizer.step() обновляет весы и смещения нашей модели (параметры).

В PyTorch вы обычно используете класс DataLoader для загрузки наборов для проверки и проверки.

loaders['train'] 

Возможен полный набор поездов, представляющий одну эпоху.

...