Мой Pytorch CNN вычисляет, но не показывает результаты обучения - PullRequest
0 голосов
/ 20 февраля 2020

Я пишу CNN для классификации некоторых изображений. когда я запускаю обучающую часть своего кода, я получаю только вывод «Обучение завершено». Это говорит мне о том, что мой код был перебран, но он не был успешно вычислен - у меня нет ошибок, и я действительно пытался идентифицировать ошибку.

Предполагается, что входной размер fc1 (первого подключенного слоя) будет сглаженным предыдущим слоем.

Данные

train_split = 0.70 # Defines the ratio of train/valid/test data.
valid_split = 0.10

train_size = int(len(data_df)*train_split)
valid_size = int(len(data_df)*valid_split)

ins_dataset_train = ImageNet10(
   df=data_df[:train_size],
   transform=data_transform,
)

ins_dataset_valid = ImageNet10(
   df=data_df[train_size:(train_size + 
   valid_size)].reset_index(drop=True),
   transform=data_transform,
)

ins_dataset_test = ImageNet10(
   df=data_df[(train_size + valid_size):].reset_index(drop=True),
   transform=data_transform,
)

Загрузчики данных

train_loader = torch.utils.data.DataLoader(
   ins_dataset_train,
   batch_size=16,
   shuffle=True,
   num_workers=2
)
valid_loader = torch.utils.data.DataLoader(
   ins_dataset_valid,
   batch_size=16,
   shuffle=True,
   num_workers=2
)
test_loader = torch.utils.data.DataLoader(
   ins_dataset_test,
   batch_size=24, # Forward pass only so batch size can be larger
   shuffle=False,
   num_workers=2
)

Сверточная нейронная сеть

class ConvNet(nn.Module):

def __init__(self, num_classes=10):
    super(ConvNet, self).__init__()


    # Add network layers here
    # Layer 1
    self.conv1 = nn.Conv2d(3,16, (3,3))
    self.pool = nn.MaxPool2d(2,2)
    self.relu = nn.ReLU()
    self.dropout = nn.Dropout(p=0.3)


        # Layer 2
    self.conv2 = nn.Conv2d(16,24, (4,4))
    self.pool = nn.MaxPool2d(2,2)
    self.relu = nn.ReLU()
    self.dropout = nn.Dropout(p=0.3)

        # Layer 3
    self.conv3 = nn.Conv2d(24,32, (4,4))
    self.pool = nn.MaxPool2d(2,2)
    self.relu = nn.ReLU()
    self.dropout = nn.Dropout(p=0.3)

        # Layer 4 - Fully connected
    self.fc1 = nn.Linear(32 * 8 * 8, 512)


    self.fc2 = nn.Linear(512, num_classes)
    self.final = nn.Softmax(dim=1)

def forward(self, x):
   out = x.reshape(x.size(0), -1) # TODO what does this do? Why do we need it?
   out = self.fc1(out)
   return out

Модель обучения

def train_model_epochs(num_epochs):
  for epoch in range(10):

    running_loss = 0.0

    for i, data in enumerate(test_loader, 0):
      images, labels = data
      print("Batch", i, "size:", len(images))

      optimizer.zero_grad()

      outputs = net(images)

      loss = loss_function(outputs, labels)

      loss.backward()

      optimizer.step()

      running_loss =+ loss.item()
      if i%1000 == 999:
         print('Epoch / Batch [%d / %d] - Loss: %.3f' %
         (epoch + 1, i + 1, running_loss / 1000))
         running_loss = 0.0    

  print("Training finished")
...