0506
卷积神经网络
传统神经网络与卷积神经网络的对比
组成
Input –conv –relu – pool – FC
输入层
卷积层
激活函数
池化层
全连接层
卷积核 即 滤波器 也就是权重参数
32-5+1=28
卷积核的大小必须要与输入层的通道数相同 32*32*3 卷积核就是5*5*3 使用6个卷积核 得到结果就是 28*28*6 所以 第二次卷积时 卷积核就是5*5*6 使用10个卷积核 结果就是24*24*10
基本刚开始的卷积操作只能提取一些简单的特征,边缘,线条,等等
卷积核在输入层上进行滑动
卷积核就是w 对应 x 也是有三通道
F11(X11)=W11X11 = 0
F12(X12)=W12X12 = 2
F13(X13)=W13X13 = 0
F=F11+F12+F13+b0 = 0+2+0+1=3 即提取出的第一个特征值
然后开始滑动
可以看到输入层是5*5*3,有2个卷积核,每个卷积核为3*3*3,所以卷积完可以得到如图绿色框图 3*3*2
步长 stride
谨慎选择 不能太大不能太小
小了,特征提取更丰富,但是效率不高
大了,会漏掉某些特征点
Padding
可以看到在卷积过程中,随着步长stride设定,最左上角的边缘点只利用了一次,但是标记的2号位置,却被利用了2次,所以为了让边缘点利用率更高,多次利用,选择在外围加一层0,使得边缘点不再是边缘点
Pad 通常选取就是 (filter_size-1)/2 filter_size就是滑动窗口的大小,也就是卷积核的h或w
计算输出的shape
假设
输入(h,w) 7*7
Filter(卷积核) 3*3
Padding 1 没有设置时padding为0
Stride 1
W也是一样
深度为Filter的个数
参数共享,权值共享
pooling层
下采样,降采样操作
也需要指定filter大小 和 步长
对卷积层提取到的特征图feature map 进行压缩,降维
Pooloing 中没有权重参数参与
Mean pooling 平均池化
Max pooling 最大池化
基本上每次卷积完都要加上非线性的变换 conv+relu ,也就是激活函数,现在常用relu函数
一般实际中,输入x 格式是 X[N,C,H,W]
N 就是batch 的编号
C 就是chnnal 通道
H 就是高
W 就是宽
python区别之[:j]和[:,j]或者双冒号[::],python冒号在数组和矩阵使用
https://blog.csdn.net/xinjieyuan/article/details/81429048
比较详细
保留第一个维度所有元素,第二维度元素保留到j”这句话不容易理解 建议换个通俗易懂的,比如: X[:,0]就是取矩阵X的所有行的第0列的元素,X[:,1] 就是取所有行的第1列的元素。 X[:,m:n]即取矩阵X的所有行中的的第m到n-1列数据,含左不含右。 X[0,:]就是取矩阵X的第0行的所有元素,X[1,:]取矩阵X的第一行的所有元素。
卷积神经网络的前向传播
这里的 :3 :3 意思是从边缘开始,从0开始到3 取了3*3 的一块 进行卷积
卷积完之后,根据步长stride为2 ,可以知道,先是横向滑动了2个位置,所以(0+2):(3+2),:3即 2:5 , :3 意思就是横着从第2个位置到第5个位置,竖着因为还没开始上下滑动,所以还是从0到3 还是3*3 的卷积
Out[0,0,0] 第一个0是第一个卷积核 卷积出来的意思,就是feature map的第一个通道,也可以理解为第一个卷积出来的feature map 第二个0 第三个0 就是第一行第一列的意思
如 Out[2,0,1] 就是第三个feature map 的第一行第二列
反向传播原理
Pooling的反向传播
存在权重参数的地方
Python3中// 和/区别
" / "表示浮点数除法,返回浮点float结果;" // "表示整数除法,返回一个不大于" / "计算结果的最大整数int,特别注意如果其中一个操作数位负数,则结果必为负数。
如:
a = 5/3
b = 5//3
c = -5/3
d = -5//3
print(a,b,c,d,sep=",")
输出结果:1.6666666666666667,1,-1.6666666666666667,-2