良好的训练准确度和损失与验证的糟糕准确度

时间:2021-06-24 09:30:12

标签: python machine-learning pytorch classification data-preprocessing

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

在这里你可以找到Training loss and 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)

1 个答案:

答案 0 :(得分:1)

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