微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于简单字母图像的 PyTorch 分类器:CNN 模型设计问题

如何解决用于简单字母图像的 PyTorch 分类器:CNN 模型设计问题

寻找有关为文本的 CAPTCHA 图像构建简单图像分类器的技巧,其中每个字母只有两种可能的字体。这是一个示例图片

full sample image

迄今为止的方法是尝试将图像分解为 6 ​​个大小相等的图像以尝试获得单个字符图像,并为这些图像构建分类器(示例如下)。

partitioned sample images

有没有更简单的方法解决这个问题?关于如何设计实际模型的任何提示? (一个相对简单的 CNN 在这里应该就足够了?)

编辑:关于在下面构建合适模型的问题。

我试图在 resnet50 之上构建一个粗略的模型以达到低于标准的效果......这似乎是一种应该相对微不足道的图像分类任务。

非常感谢有关模型设计的任何提示

代码如下:

model = models.resnet50(pretrained=True)

for param in model.parameters():
    param.requires_grad = False
    
model.fc = nn.Sequential(nn.Linear(2048,512),nn.ReLU(),nn.Dropout(0.2),nn.Linear(512,26),nn.Logsoftmax(dim=1))
criterion = nn.NLLLoss()
optimizer = optim.Adam(model.fc.parameters(),lr=0.003)
model.to(device)

epochs = 10
steps = 0
running_loss = 0
print_every = 10
train_losses,test_losses = [],[]
for epoch in range(epochs):
    for inputs,labels in train_loader:
        steps += 1
        inputs,labels = inputs.to(device),labels.to(device)
        optimizer.zero_grad()
        logps = model.forward(inputs)
        loss = criterion(logps,labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        
        if steps % print_every == 0:
            test_loss = 0
            accuracy = 0
            model.eval()
            with torch.no_grad():
                for inputs,labels in val_loader:
                    inputs,labels.to(device)
                    logps = model.forward(inputs)
                    batch_loss = criterion(logps,labels)
                    test_loss += batch_loss.item()
                    
                    ps = torch.exp(logps)
                    top_p,top_class = ps.topk(1,dim=1)
                    equals = top_class == labels.view(*top_class.shape)
                    accuracy += torch.mean(equals.type(torch.FloatTensor)).item()
            train_losses.append(running_loss/len(train_loader))
            test_losses.append(test_loss/len(val_loader))                    
            print(f"Epoch {epoch+1}/{epochs}.. "
                  f"Train loss: {running_loss/print_every:.3f}.. "
                  f"Test loss: {test_loss/len(val_loader):.3f}.. "
                  f"Test accuracy: {accuracy/len(val_loader):.3f}")
            running_loss = 0
            model.train()

上述结果如下所示,达到

model results

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。