Модель не обучается

я создал CNN для бинарной классификации изображений:

class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        
        self.conv1 = nn.Conv2d(3, 32, 5)
        self.conv2 = nn.Conv2d(32, 64, 5)
        self.conv3 = nn.Conv2d(64, 124, 5)
        self.fc1 = nn.Linear(15004, 128)  
        self.fc2 = nn.Linear(128, 2)

    def forward(self, x):
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = F.max_pool2d(F.relu(self.conv3(x)), 2)
        x = torch.flatten(x, 1) 
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

Происходит обучение :

num_epochs = 3
num_classes = 10
batch_size = 100
learning_rate = 0.01
model = Net()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
loss_list = []
acc_list = []

total_step = len(testset)

for epoch in range(num_epochs):
    for i in range(748):
        # Прямой запуск

        if i!=373:
            outputs = model(trainset[i*100 : (i+1)*100].float())
            c = target[i*100 : (i+1)*100]
            loss = criterion(torch.as_tensor(outputs), torch.as_tensor(c))
            loss_list.append(loss.item())
        else:
            outputs = model(trainset[i * 100: 37384].float())
            loss = criterion(torch.as_tensor(outputs), torch.as_tensor(target[i * 100: 37384]))
            loss_list.append(loss.item())
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if i!=373:
            label = labels[i*100 : (i+1)*100]
        else:
            label = labels[i * 100: 37384]
        # Отслеживание точности
        total = label.size(0)
        _, predicted = torch.max(outputs.data, 1)
        correct = (predicted == label).sum().item()
        acc_list.append(correct / total)

        if (i + 1) % 100 == 0:
            print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}, Accuracy: {:.2f}%'
                  .format(epoch + 1, num_epochs, i + 1, total_step, loss.item(),
                          (correct / total) * 100))
    outputs = model(testset.float())
    total = labelstest.size(0)
    _, predicted = torch.max(outputs.data, 1)
    correct = (predicted == labelstest).sum().item()
    print(correct / total)

И во время обучения accuracy для объектов, принадлежащих первому классу составляет 100 процентов, а для объектов, принадлежащих второму классу 0 процентов. Причем в следующей эпохе ситуация не меняется. В чем может быть проблема?


Ответы (0 шт):