Нейронная сеть Pytorch (вероятно) не учится - PullRequest
0 голосов
/ 31 мая 2019

Моя домашняя работа - тренировать сеть на заданном наборе данных из 3000 лягушек, кошек и собак.Сеть, которую я построил, похоже, совсем не улучшается.Почему это так?

Тренировочные данные x_train - это грубая фигура (3000,32,32,3).

class Netz(nn.Module):
    def __init__(self):
        super(Netz, self).__init__()
        self.conv1 = nn.Conv2d(3,28,5)
        self.conv2 = nn.Conv2d(28,100,5)
        self.fc1 = nn.Linear(2500,120)
        self.fc2 = nn.Linear(120,3)

    def forward(self, x):
        x = self.conv1(x)
        x = F.max_pool2d(x,2)
        x = F.relu(x)
        x = self.conv2(x)
        x = F.max_pool2d(x,2)
        x = F.relu(x)
        x = x.view(-1,2500)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return F.log_softmax(x)


model = Netz()
optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.8)

def train(epoch):
    model.train()
    avg_loss = 0
    correct = 0
    criterion = F.nll_loss
    for i in range(len(x_train)):
        optimizer.zero_grad()
        x = torch.tensor(x_train[i])
        x = x.permute(2, 0, 1)
        x = Variable(x)
        x = x.unsqueeze(0)
        target = Variable(torch.Tensor([y_train[i]]).type(torch.LongTensor))
        out = model(x)
        loss = criterion(out, target)
        avg_loss += loss
        pred = out.argmax(dim=1, keepdim=True)
        correct += pred.eq(target.view_as(pred)).sum().item()
        loss.backward()
        optimizer.step()
        if i%64==0:
            print("epoch ", epoch, " [", i, "/", len(x_train), "] average loss: ", avg_loss.item() / 64, " correct: ", correct, "/64")
            avg_loss = 0
            correct = 0

Я ожидаю, что средняя ошибка уменьшится со временем, нокажется, колеблется вокруг одного и того же числа ...

1 Ответ

0 голосов
/ 01 июня 2019

Ваша потеря колеблется, значит ваша сеть недостаточно мощна для извлечения значимых вложений.Я могу порекомендовать попробовать одну из этих нескольких вещей.

  1. Добавить больше слоев.
  2. Использовать меньшую скорость обучения.
  3. Использовать больший набор данных или использовать предварительнообученной модели, если у вас есть только небольшой набор данных.
  4. Нормализуйте ваш набор данных.
  5. Набор для обучения в случайном порядке.
  6. Играйте с гиперпараметрами.
...