why CNN?
-
我jio得学习一个东西时,始终要不断的问自己这个东西有啥用,应该怎么用,这样才不至于学完之后大脑还是一片空白(不好意思,我看完很多书之后都是这种感觉hhh)
-
那么我们为啥要用NN?之前的机器学习方法譬如SVM,贝叶斯分类器等等不好吗?
在现在的大数据时代。。。不好意思,感觉现在知识还完全不够,可能等我学完之后可以稍微说一下自己的看法吧hhh -
CNN基础知识
一个CNN大概包括卷积层,池化层,全连接层等几个部分 -
卷积层:利用卷积核(filter)对输入数据进行特征提取,filter可以看作是一个指定窗口大小的扫描器
-
池化层:是一种提取数据核心特征的方式,不仅实现了对原始数据的压缩,还大大减少了参与模型计算的参数,提高了计算效率,emmmm,貌似跟卷积层也没有什么区别鸭
-
全连接层:主要是将输入图像在经过卷积和池化操作后提取的特征进行压缩,并完成模型的分类功能,这其实就是NN的最初构造
-
下面我们详细展开介绍:
-
假如输入图像是32 *32 * 3(三个参数分别是指:高度,宽度,通道数),那么我们可以定义卷积核为 3 * 3 * 3 or 5 * 5 * 3 or 7 * 7 * 3 or 其他,但高度和宽度一般小于输入图像的高度和宽度,需要特别注意的是卷积核的深度一定等于输入图像的通道数
-
卷积核的步长(stride)代表卷积核窗口每次经过的图像上的像素点数,一般取值为1或2
-
边界填空(Padding)是指在输入图像的最外层加上指定层数的值全为0的像素边界,可以设置两个参数Same,Valid。第一个代表加Padding,第二个代表不加。一般取值为1或2
-
重要:卷积通用公式:
W o u t p u t = ( W i n p u t − W f i l t e r + 2 p ) / s + 1 W_{output}=(W_{input}-W_{filter}+2p)/s+1 Woutput=(Winput−Wfilter+2p)/s+1
H
o
u
t
p
u
t
=
(
H
i
n
p
u
t
−
H
f
i
l
t
e
r
+
2
p
)
/
s
+
1
H_{output}=(H_{input}-H_{filter}+2p)/s+1
Houtput=(Hinput−Hfilter+2p)/s+1
卷积层的代码示例:
torch.nn.Conv2d(1, 64, kernel_size = 3, stride = 1, padding = 1)
五个参数分别代表:输入通道数(卷积核的深度,与输入图片通道数一致),输出通道数(卷积次数),卷积核大小,卷积核移动步长,Padding值
- 常用的池化层有平均池化层和最大池化层 池化层也需要定义一个滑动窗口,但这个窗口仅用于提取重要特征,没有任何参数
- 一般定义池化窗口的大小为1 * 1或 2 * 2,池化层的深度和特征图的深度一致,一般定义滑动窗口的步长为2
- 池化层的输入输出通道数一致
- 池化通用公式
W o u t p u t = ( W i n p u t − W f i l t e r ) / s + 1 W_{output}=(W_{input}-W_{filter})/s+1 Woutput=(Winput−Wfilter)/s+1
H
o
u
t
p
u
t
=
(
H
i
n
p
u
t
−
H
f
i
l
t
e
r
)
/
s
+
1
H_{output}=(H_{input}-H_{filter})/s+1
Houtput=(Hinput−Hfilter)/s+1
池化层的代码示例:
torch.nn.MaxPool2d(stride = 2, kernel_size = 2)
- 全连接层主要有输入,权重参数,激活函数三个部分组成, 输入的是经过卷积层和池化层的核心特征,经过激活函数后得出了最终的分类结果
全连接层的代码示例:
torch.nn.Linear(14*14*128, 1024)