记录一下关于用CNN识别验证码损失无法收敛的问题

@[toc]

网络模型代码

import torch
from torch import nn
from torch.utils.data import Dataset

class CnnModel(nn.Module):
    def __init__(self):
        super(CnnModel, self).__init__()
        self.cnn = nn.Sequential(
            nn.Conv2d(1, 32, kernel_size=[3, 3], stride=1, dtype=torch.float32),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),

            nn.Conv2d(32, 64, kernel_size=[3, 3], stride=1, dtype=torch.float32),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),

            nn.Conv2d(64, 128, kernel_size=[3, 3], stride=1, dtype=torch.float32),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
        )
        self.fc = nn.Sequential(
            nn.Linear(128*5*20, 1024),
            nn.LeakyReLU(),
            nn.Linear(1024, 248)
        )

    def forward(self,x):
        x = self.cnn(x)
        x = x.view(1, -1)
        x = self.fc(x)
        return x.view(-1, 248)

class MyDataSet(Dataset):
    def __init__(self,x,y,len):
        self.x = x
        self.y = y
        self.len = len

    def __getitem__(self, item):
        return self.x[item],self.y[item]

    def __len__(self):
        return self.len

现象

开始损失从22一直迅速降到了6左右,但是到了6左右就怎么降不下来了。

排查情况

目前排查出现这个情况的原因是因为在cnn网络中进行卷积操作,但是每一次卷积操作都减少了特征点,因为padding默认是vaild模式。解决方法是padding设置为same模型。