0

我正在学习 pytorch,我已经创建了二进制分类算法。在训练完模型后,我的损失非常低,准确率也非常好。然而,在验证时,准确度正好是 50%。我想知道我是否错误地加载了样本或算法表现不佳。

在这里您可以找到Training loss 和 accuracy的图。

这是我的训练方法:

epochs = 15
itr = 1
p_itr = 100
model.train()
total_loss = 0
loss_list = []
acc_list = []
for epoch in range(epochs):
    for samples, labels in train_loader:
        samples, labels = samples.to(device), labels.to(device)
        optimizer.zero_grad()
        output = model(samples)
        labels = labels.unsqueeze(-1)
        labels = labels.float()
        loss = criterion(output, labels)
        loss.backward()
        optimizer.step()
        total_loss += loss.item()
        scheduler.step()
    
    #if itr%p_itr == 0:
    pred = torch.round(output)
    correct = pred.eq(labels)
    acc = torch.mean(correct.float())
    print('[Epoch {}/{}] Iteration {} -> Train Loss: {:.4f}, Accuracy: {:.3f}'.format(epoch+1, epochs, itr, total_loss/p_itr, acc))
    loss_list.append(total_loss/p_itr)
    acc_list.append(acc)
    total_loss = 0
        
    itr += 1

在这里,我从路径加载数据:

train_list_cats = glob.glob(os.path.join(train_cats_dir,'*.jpg'))
train_list_dogs = glob.glob(os.path.join(train_dogs_dir,'*.jpg'))
train_list = train_list_cats + train_list_dogs

val_list_cats = glob.glob(os.path.join(validation_cats_dir,'*.jpg'))
val_list_dogs = glob.glob(os.path.join(validation_dogs_dir,'*.jpg'))

val_list = val_list_cats + val_list_dogs

我没有附加模型架构,但是如果需要,我可以添加它。我认为我的训练方法是正确的,但我不确定训练/验证数据处理。

编辑:

网络参数如下:

optimizer = torch.optim.RMSprop(model.parameters(), lr=0.001)
criterion = nn.BCELoss()
scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[500,1000,1500], gamma=0.5)

激活函数是sigmoid

网络架构

 self.layer1 = nn.Sequential(
        nn.Conv2d(3,16,kernel_size=3),
        nn.ReLU(),
        nn.MaxPool2d(2),
        nn.Dropout(p=0.2)
    )
    
    self.layer2 = nn.Sequential(
        nn.Conv2d(16,32, kernel_size=3),
        nn.ReLU(),
        nn.MaxPool2d(2),
        nn.Dropout(p=0.2)
        )
    
    self.layer3 = nn.Sequential(
        nn.Conv2d(32,64, kernel_size=3),
        nn.ReLU(),
        nn.MaxPool2d(2),
        nn.Dropout(p=0.2)
    )       
  
    self.fc1 = nn.Linear(17*17*64,512)
    self.fc2 = nn.Linear(512,1)
    self.relu = nn.ReLU()
    self.sigmoid = nn.Sigmoid()
    
    
def forward(self,x):
    out = self.layer1(x)
    out = self.layer2(out)
    out = self.layer3(out)
    out = out.view(out.size(0),-1)
    out = self.relu(self.fc1(out))
    out = self.fc2(out)
    return torch.sigmoid(out)
4

1 回答 1

1

根据您的“训练损失和准确性”图,您的模型过度拟合。在 25 个 epoch 之后,您的 train loss 接近于零,并且您继续训练 200+ epoch。这是训练模型的错误方法。您应该根据验证集提前停止。IE。运行一个时期的 train 和一个时期的 eval 并重复。当您的 train epoch 正在改善并且相应的 eval epoch 没有改善时停止。

于 2021-06-24T10:56:11.147 回答