目录
1.CNN卷积神经网络的介绍
可以处理多维数据是CNN的重要特征(因为有卷积)
车牌也是采用三通道进行训练
先是对一个批次的数据集通过卷积层提取特征
然后是池化层压缩特征
然后再卷积再池化
然后展开输出分类结果
2.卷积神经网络识别分类原理
卷积层主要就是对输入特征进行提取
通过卷积核来实现,卷积核就可以看成一个指定大小的扫描器窗口
扫描器通过滑动来提取整个图片特征
并且将特征送入池化层
也是滑动窗口实现池化
最后送入全连接层,输入结果
所以实际上前面都是在提取特征
最重要的计算分类还是在全连接层
3.编码
3.1定义网络
卷积神经网络的定义类
必须要继承module
打开中文文档
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其他
然后就是实例化网络
然后参照之前的简单的二次函数的网络拟合定义
- 先定义优化器
- 然后选择损失函数
具体的看下图
4小结
所以网络实质上就是:
- 先写好网络结构(输入到输出所需要经过的网络层)(一些层间的预处理(relu,view等)可以写在网络结构里,也可以写在forward里)
- 然后是写好前向传播,在这一部分里,输入到输出的完整流程要体现出来
- 定义优化器和损失函数