记录一下关于用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模型。