文章目录
深度学习理论系列: 深度学习01
1 CNN的结构
1.1 卷积层
由滤波器filters和激活函数构成。 一般要设置的超参数包括filters的数量、大小、步长,以及padding是“valid”还是“same”。当然,还包括选择什么激活函数。
1.1.1 padding 填白
每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。比如把(8,8)的图片给补成(10,10),那么经过(3,3)的filter之后,还是(8,8),没有变。把卷积后大小不变称为 “Same”方式, 把不经过任何填白的,称为 “Valid”方式。
1.1.2 stride 步长
默认步长是1,如果(8,8)的输入,我们用(3,3)的filter, 如果stride=1,则输出为(6,6); 如果stride=2,则输出为(3,3)
1.1.3 卷积
如果input是一维8x8的黑白图片,filter是3x3,那卷积后的output是6x6
如果input是三维8x8的彩色图片,filter是3x3x3(最后一个3表示filter是三维,这个维度要和input一致,如若input是2维,则filer也要2维),那卷积后的output也是6x6(三个channel的所有元素对应相乘后求和,也就是27个乘积的和),因为下图中filter只有对角线有非0,因此只乘了对角线,实际是表格中每个元素都要相乘。
如果使用多个filters同时卷积,比如,如果我们同时使用4个filter的话,那么 输出的维度则会变为(6,6,4),相当于做了四次filter,每次filter输出的维度是(6,6,1)。
如果用我们神经网络的符号来看待CNN的话:
- 我们的输入图片就是X,shape=(8,8,3);
- 4个filters其实就是第一层神金网络的参数W1,,shape=(3,3,3,4),这个4是指有4个filters;
- 我们的输出,就是Z1,shape=(6,6,4);
- 后面其实还应该有一个激活函数,比如relu,经过激活后,Z1变为A1,shape=(6,6,4);
1.2 池化层
该层主要是为了提取一定区域的主要特征,并减少参数数量,防止模型过拟合。方法有MaxPooling(取那个区域的max)还有AveragePooling(取那个区域的平均值)
1.2.1 max pooling
如下面的MaxPooling,采用了一个2×2的窗口,并取stride=2
1.3 全连接层
在进全连接层之前,会先Flatten,就是把 (height,width,channel)的数据压缩成长度为 height × width × channel 的一维数组,然后再与 FC层连接,这之后就跟普通的神经网络无异了。
2 CNN in Keras
- 假设我们input是一个1×28×28的image
- 通过25个filter的convolution layer以后你得到的output,会有25个channel,又因为filter的size是3×3,因此如果不考虑image边缘处的处理的话,得到的channel会是26×26的,因此通过第一个convolution得到25×26×26的cubic image(这里把这张image想象成长宽为26,高为25的cubic立方体)
- 接下来就是做Max pooling,把2×2的pixel分为一组,然后从里面选一个最大的组成新的image,大小为25×13×13(cubic长宽各被砍掉一半)
- 再做一次convolution,假设这次选择50个filter,每个filter size是33的话,output的channel就变成有50个,那13×13的image,通过33的filter,就会变成11×11,因此通过第二个convolution得到50×11×11的image(得到一个新的长宽为11,高为50的cubic)
再做一次Max Pooling,变成50×50×5
需要注意的是在第一个convolution里面,每一个filter都有9个参数;但是在第二个convolution layer里面,虽然每一个filter都是3×3,但它其实不是3×3个参数,因为它的input是一个25×13×13的cubic,这个cubic的channel有25个,所以要用同样高度的cubic filter对它进行卷积,于是我们的filter实际上是一个25×3×3的cubic,所以这边每个filter共有225个参数