簡體   English   中英

良好的訓練准確度和損失與驗證的糟糕准確度

[英]Good accuracy and loss on training vs bad accuracy on validation

我正在學習 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)

根據您的“訓練損失和准確性”圖,您的模型過度擬合。 您的訓練損失在 25 個時期后接近於零,並且您繼續訓練 200 多個時期。 這是訓練模型的錯誤方法。 您應該根據驗證集提前停止。 IE。 運行一個 epoch 的 train 和一個 epoch 的 eval 並重復。 當您的 train epoch 正在改進並且相應的 eval epoch 沒有改進時停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM