【问题标题】:Good accuracy and loss on training vs bad accuracy on validation训练时的良好准确性和损失与验证时的差准确性
【发布时间】:2021-09-07 19:03:11
【问题描述】:

我正在学习 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)

【问题讨论】:

  • 你需要告诉我们你的criterion是什么,你的网络的输出范围是多少(即有没有激活函数?)
  • @KonstantinosKokos,我为这个问题添加了更多解释

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 2021-11-12
    • 2020-07-08
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多