目录
可以处理多维数据是CNN的重要特征(因为有卷积)
车牌也是采用三通道进行训练
先是对一个批次的数据集通过卷积层提取特征
然后是池化层压缩特征
然后再卷积再池化
然后展开输出分类结果
卷积层主要就是对输入特征进行提取
通过卷积核来实现,卷积核就可以看成一个指定大小的扫描器窗口
扫描器通过滑动来提取整个图片特征
并且将特征送入池化层
也是滑动窗口实现池化
最后送入全连接层,输入结果
所以实际上前面都是在提取特征
最重要的计算分类还是在全连接层
卷积神经网络的定义类
必须要继承module
打开中文文档
init构造方法
然后是super继承父类
然后是 两个卷积层,用的是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*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
- '''
注意前向传播中有一项.view这是为了将之前conv2输出的(32,15,10)的Tensor拉平为(32*15*10,1)的向量
以下就是24个分类结果(也可以理解为输出的y的ground truth)
也就是说,经过前处理的图片输出网络后,会输出一个(1,24)的向量,代表这张图片在24个结果上的最高概率是哪一类
然后就是实例化网络
然后参照之前的简单的二次函数的网络拟合定义
具体的看下图
所以网络实质上就是: