VGG16做二分类时loss维持0.69不降解决办法
在使用VGG16做二分类任务(如猫和狗分类)时,可能会遇到这种情况:损失值loss总是维持在0.69,或者准确率恒等于50%,无论如何调整学习率(尝试过0.001、0.0001和0.00001),loss始终不降。一种简单的解决办法在每个卷积层的后面添加一个BN(Batch Normalization)层。
·
在使用VGG16做二分类任务(如猫和狗分类)时,可能会遇到这种情况:损失值loss总是维持在0.69,或者准确率恒等于50%,无论如何调整学习率(尝试过0.001、0.0001和0.00001),loss始终不降。
一种简单的解决办法在每个卷积层的后面添加一个BN(Batch Normalization)层,之后重新训练(可以自己尝试使用不同的学习率,我用的是0.00001),损失值loss开始下降。模型代码如下所示:
import torch
import torch.nn as nn
class VGG16(nn.Module):
def __init__(self, num_classes=2):
super(VGG16, self).__init__()
self.features = nn.Sequential(
# 第一个卷积块
nn.Conv2d(3, 64, kernel_size=3, padding=1),
nn.BatchNorm2d(64), # 在每个卷积层后面添加BN层,后面以此类推
nn.ReLU(inplace=True),
nn.Conv2d(64, 64, kernel_size=3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
# 第二个卷积块
nn.Conv2d(64, 128, kernel_size=3, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(inplace=True),
nn.Conv2d(128, 128, kernel_size=3, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
# 第三个卷积块
nn.Conv2d(128, 256, kernel_size=3, padding=1),
nn.BatchNorm2d(256),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.BatchNorm2d(256),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.BatchNorm2d(256),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
# 第四个卷积块
nn.Conv2d(256, 512, kernel_size=3, padding=1),
nn.BatchNorm2d(512),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, kernel_size=3, padding=1),
nn.BatchNorm2d(512),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, kernel_size=3, padding=1),
nn.BatchNorm2d(512),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
# 第五个卷积块
nn.Conv2d(512, 512, kernel_size=3, padding=1),
nn.BatchNorm2d(512),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, kernel_size=3, padding=1),
nn.BatchNorm2d(512),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, kernel_size=3, padding=1),
nn.BatchNorm2d(512),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
)
self.classifier = nn.Sequential(
nn.Linear(512 * 7 * 7, 4096),
nn.ReLU(inplace=True),
nn.Dropout(0.5),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Dropout(0.5),
nn.Linear(4096, num_classes),
)
经过修改以后,loss开始下降,模型训练逐渐收敛。运行结果如下所示:
Epoch: 1/100, Train Loss: 0.7099, Train Acc: 55.29%, Val Loss: 0.6698, Val Acc: 55.33%
Epoch: 2/100, Train Loss: 0.6817, Train Acc: 58.95%, Val Loss: 0.6235, Val Acc: 65.00%
Epoch: 3/100, Train Loss: 0.6589, Train Acc: 61.33%, Val Loss: 0.6153, Val Acc: 65.00%
Epoch: 4/100, Train Loss: 0.6402, Train Acc: 64.57%, Val Loss: 0.6164, Val Acc: 65.00%
Epoch: 5/100, Train Loss: 0.6276, Train Acc: 64.86%, Val Loss: 0.5848, Val Acc: 69.50%
Epoch: 6/100, Train Loss: 0.6237, Train Acc: 64.86%, Val Loss: 0.5739, Val Acc: 70.83%
Epoch: 7/100, Train Loss: 0.6132, Train Acc: 65.57%, Val Loss: 0.5656, Val Acc: 68.83%
Epoch: 8/100, Train Loss: 0.5894, Train Acc: 69.05%, Val Loss: 0.5390, Val Acc: 74.50%
Epoch: 9/100, Train Loss: 0.5864, Train Acc: 69.19%, Val Loss: 0.5418, Val Acc: 73.33%
Epoch: 10/100, Train Loss: 0.5738, Train Acc: 69.00%, Val Loss: 0.5389, Val Acc: 73.33%
Epoch: 11/100, Train Loss: 0.5585, Train Acc: 71.43%, Val Loss: 0.5023, Val Acc: 77.00%
Epoch: 12/100, Train Loss: 0.5466, Train Acc: 71.24%, Val Loss: 0.4997, Val Acc: 77.00%
Epoch: 13/100, Train Loss: 0.5326, Train Acc: 72.81%, Val Loss: 0.5493, Val Acc: 71.50%
Epoch: 14/100, Train Loss: 0.5410, Train Acc: 72.19%, Val Loss: 0.4826, Val Acc: 77.17%
Epoch: 15/100, Train Loss: 0.5147, Train Acc: 74.81%, Val Loss: 0.4728, Val Acc: 78.67%
更多推荐

所有评论(0)