Torch车牌字符识别-网络搭建(五)

目录

1.CNN卷积神经网络的介绍

2.卷积神经网络识别分类原理

3.编码

3.1定义网络

3.2卷积层

 3.2.1卷积层小结

3.4前向传播 

 3.5其他

1.CNN卷积神经网络的介绍

可以处理多维数据是CNN的重要特征(因为有卷积)

车牌也是采用三通道进行训练

先是对一个批次的数据集通过卷积层提取特征

然后是池化层压缩特征

然后再卷积再池化

然后展开输出分类结果

2.卷积神经网络识别分类原理

卷积层主要就是对输入特征进行提取

通过卷积核来实现,卷积核就可以看成一个指定大小的扫描器窗口

扫描器通过滑动来提取整个图片特征 

并且将特征送入池化层

也是滑动窗口实现池化

最后送入全连接层,输入结果

所以实际上前面都是在提取特征

最重要的计算分类还是在全连接层

3.编码

3.1定义网络

卷积神经网络的定义类

必须要继承module

打开中文文档

 主页 - PyTorch中文文档

init构造方法

然后是super继承父类

3.2卷积层

然后是 两个卷积层,用的是Sequential方法(具体见中文文档)

Sequential是一个时序容器

可以把卷积层需要的一些操作(比如说relu等)放入Sequential中

然后模型运行的时候就会按照传入顺序执行这些操作

在卷积层中

先是定义了卷积核的卷积核等一些属性

然后是relu

和池化层

因为输入是3通道rgb,所以这里等in _channels是3

out _channels

 就是卷积核的数量

 然后就是再过一层relu和一层pooling

nn.MaxPool2d(kernel_size=2)   #维度变换(16,60,40) --> (16,30,20)

 但是这里对输入维度是2对倍数,所以维度/2就是maxpool2d后对输出维度

 3.2.1卷积层小结

 这个网络就是输入是(3*60*40)对Tensor

然后经过网络变换后:

上面的笔记看错了conv2的out_channles是32

所以输出(32,15,10)的tensor

输出经过线性层给出结果(此结果是24列,代表24哥分类)

补充一个例子

import torch
import torch.nn as nn
import torch.nn.functional as F


class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Sequential(
            nn.Conv2d(1,1,kernel_size=5, padding=1,stride=2),
            nn.MaxPool2d(kernel_size=3, padding=0,stride=2),
            nn.Conv2d(1,1,kernel_size=3, padding=1,stride=1),

        )

    def forward(self,x):
        x = self.conv1(x)
        return x
    
cnn=CNN()
input=torch.randn(1,200,200)
output=cnn.forward(input)
print(output.shape)
      
#输出大小 = (输入大小 + 2 * padding - kernel size) / stride + 1
'''
所以上述代码完成的操作是
输入200*200
conv1 -> (200-5+2)/2+1 = 99
maxpool -> (99-3)/2+1=49
con2 -> (49-3+2)/1+1 = 49
'''

 

3.4前向传播 

 注意前向传播中有一项.view这是为了将之前conv2输出的(32,15,10)的Tensor拉平为(32*15*10,1)的向量

 以下就是24个分类结果(也可以理解为输出的y的ground truth)

也就是说,经过前处理的图片输出网络后,会输出一个(1,24)的向量,代表这张图片在24个结果上的最高概率是哪一类 

 3.5其他

然后就是实例化网络

然后参照之前的简单的二次函数的网络拟合定义

  1. 先定义优化器
  2. 然后选择损失函数 

具体的看下图

 4小结

所以网络实质上就是:

  1. 先写好网络结构(输入到输出所需要经过的网络层)(一些层间的预处理(relu,view等)可以写在网络结构里,也可以写在forward里)
  2. 然后是写好前向传播,在这一部分里,输入到输出的完整流程要体现出来
  3. 定义优化器和损失函数
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,让我们来搭建一个卷积神经网络来实现猫的种类识别。 首先,我们需要导入相关的库。我们将使用PyTorch来构建我们的模型,并使用torchvision加载和预处理我们的数据集。 ```python import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms ``` 接下来,我们需要定义我们的数据集和数据加载器。我们将使用ImageFolder数据集,它会自动从文件夹中读取图像,并将它们标记为不同的类别。我们还将使用transforms来对图像进行预处理,例如将它们缩放为相同的大小并进行归一化。 ```python # 定义数据集和转换 transform = transforms.Compose( [transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) trainset = torchvision.datasets.ImageFolder(root='./data/train', transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2) testset = torchvision.datasets.ImageFolder(root='./data/test', transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2) classes = trainset.classes ``` 现在我们可以开始定义我们的模型。我们将使用一个卷积神经网络,其中包含三个卷积层和三个池化层,然后是两个全连接层。我们还将使用Dropout来减少过拟合。 ```python class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.conv3 = nn.Conv2d(16, 32, 5) self.fc1 = nn.Linear(32 * 25 * 25, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, len(classes)) self.dropout = nn.Dropout(p=0.5) def forward(self, x): x = self.pool(nn.functional.relu(self.conv1(x))) x = self.pool(nn.functional.relu(self.conv2(x))) x = self.pool(nn.functional.relu(self.conv3(x))) x = x.view(-1, 32 * 25 * 25) x = self.dropout(nn.functional.relu(self.fc1(x))) x = self.dropout(nn.functional.relu(self.fc2(x))) x = self.fc3(x) return x net = Net() ``` 现在我们可以定义损失函数和优化器。我们将使用交叉熵损失函数和随机梯度下降优化器。 ```python criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) ``` 最后,我们可以开始训练我们的模型。我们将对模型进行10个周期的训练,并在每个周期后进行测试。 ```python # 训练模型 for epoch in range(10): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 2000 == 1999: print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0 # 在测试集上测试模型 correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the test images: %d %%' % ( 100 * correct / total)) ``` 这是一个基本的卷积神经网络模型,可以用来识别猫的不同品种。可以根据需要对其进行改进和调整,以提高其性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值