我尝试实现 vggnet,但它没有得到很好的训练

I try to implement vggnet, but it does not be trained well

我是 CNN 的新人。 我尝试训练 vggnet。

class 净值(nn.Module) :

def __init__(self) :
    super(Net, self).__init__()

    self.conv = nn.Sequential ( 
        #1
        #####
        nn.Conv2d(3,64,3, padding=1),  nn.ReLU(inplace=True), 
        nn.Conv2d(64,64,3, padding=1),nn.ReLU(inplace=True),
        nn.MaxPool2d(2,2),
        #2
        #####
        nn.Conv2d(64,128,3, padding=1), nn.ReLU(inplace=True),
        nn.Conv2d(128,128,3, padding=1),nn.ReLU(inplace=True),
        nn.MaxPool2d(2,2),       
        #####
        #3
        #####
        nn.Conv2d(128,256,3, padding=1),nn.ReLU(inplace=True),
        nn.Conv2d(256,256,3, padding=1),nn.ReLU(inplace=True),
        nn.Conv2d(256,256,3, padding=1),nn.ReLU(inplace=True),
        nn.MaxPool2d(2,2),      
        #4
        #####
        nn.Conv2d(256,512,3, padding=1), nn.ReLU(inplace=True),
        nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
        nn.Conv2d(512,512,3, padding=1), nn.ReLU(inplace=True),
        nn.MaxPool2d(2,2),  
        #5
        #####
        nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
        nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
        nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
        nn.MaxPool2d(2,2), 
        ##### 
    )
    self.fc = 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, 1000)
    )

    
   


def forward(self, x):

    # diffrent depending on the model
    x = self.conv(x)
    # change dimension 
    x = torch.flatten(x, 1)
    # same 
    x = self.fc(x)

    return x

但亏损在6.9077附近

epoch 0 之后,它很少改变。

即使我将权重衰减更改为 0(不使用 L2 归一化),损失也会略有变化。

我的优化器和调度器是

优化器 = torch.optim.SGD(net.parameters(), lr=0.1, weight_decay=5e-4)

调度器=lr_scheduler.ReduceLROnPlateau(优化器,因子=0.1,耐心=2,模式='min')

这是什么问题。 有时,它打印字节但只得到 0。 warnings.warn(海峡(味精)) 这与我的问题有关?

您的损失值 6.9077 等于 -log(1/1000),这基本上意味着您的网络从所有可能的 1000 个 类.

中产生随机输出

从头开始训练 VGG 网络有点棘手,尤其是在不包含批归一化层的情况下。

尝试将学习率降低到 0.01,并为您的 SGD 增加动力。

添加更多输入增强(例如,翻转颜色抖动等)。