5.16-CNN实现及原理

这次讲一讲如何在keras中简单实现CNN对手写数字的识别.
首先在上一课的讲述中,图像现在是分RGB三个通过,以立方体的形式来检测和卷积的,一般一维的叫做向量vector,那么三维这个立方体矩阵就叫做tensor张量。
model2.add( Convolution2D(25,3,3,
            input_shape=(1,28,28) ) )
model2.add(MaxPooling2D((2,2)))
model2.add( Convolution2D(50,3,3) )
model2.add(MaxPooling2D((2,2)))
先写卷积层和池化层的设定,如上,convolution就是卷积层, 这个2D我不知道是啥,(25,3,3)的意思是这个卷积层有25个卷积核,每个核是3*3大小的,后面(1,28,28)就是描述输入形状的,比如这里是手写数字辨识,颜色是黑白一个通道,所以是1,如果是RGB图像这里就是3,图像大小是28*28个像素点。然后是池化层,(2,2)的意思是在2*2大小的选定框里面取值。
这里需要注意在第一层的时候卷积层的每一个卷积核只有3*3=9个参数,是因为面对的输入是1维的。而在第一轮卷积池化之后,输出的其实是25*13*13的长方体。所以不管第二层设置多少个卷积核,这里设了50个,每一个核的尺寸是3*3,但是包含的参数其实是需要适应前面输进来的25*13*13的长方体的,所以核其实长25*3*3的样子,有225个参数。
然后这里因为没有加0去解决边角问题(28÷3除不尽)所以28过3的核之后得到26个数字,所以变成26*26,后面的13变11也是。26变13不用说,因为过了2*2的池化,2取1砍了一半,11变5也是。搞清楚这些卷积池化操作的结果,其实就是搞清楚这些尺寸的变化。
model2.add(Flatten())
model2.add(Dense(output_dim=100))
model2.add(Activation('relu'))
model2.add(Dense(output_dim=10))
model2.add(Activation('softmax'))
然后就是把结果交给flatten来拉直成一个1250长的向量,送到一个FCN全连接的网络中去。

下面是一些趣味性的拓展知识,很多人经常不理解深度学习到底是怎么进行学习的,这里就分析分析CNN到底学到了什么。
首先定义一个a,这个a是某个卷积核的结果,然后这里的ak就是这个卷积核被激活的程度,然后通过这个ak反过来寻找让卷积核结果被最大激活的x值,叫做x*,下面就是x*的样子。 会发现它呈现出一些纹路的样子,所以说卷积池化找的特征就是这些整张图中的一些细节部分。
然后再在FCN这里的某一层同样定义a、ak、x*,同样用梯度上升法gradient acent来找原来的x,得到的是一些图案,但是还是和手写数字没什么关系。不过此时就不是小纹路了,而是整张图里面的特征。
那如果从输出中寻找呢,从y定义,找让y最被激活的x值,找出来的却是这样子像电视雪花屏的东西,也就是说CNN确实可以从这样子的图像中分辨出数字1~9,虽然人完全看不出来。
那么我们再加一些判标,比如让大部分的地方都没有颜色,只让很少的x是黑色的,公式就这样写了,让y最大的同时,让x像素绝对值的和最小(通过-号),这样其实就有大概的数字的轮廓了。
通过这个其实就是想说虽然深度学习的过程好像是黑匣子,但是其实是有迹可循的。下面这个deep style就是从另一层面反映了CNN可以学的东西,比如从照片中学content内容,从右边学style风格,然后如果两者融合,就能得到呐喊风格的照片。

最后callback一下,我们之前说为什么可以把全连接的FCN进行缩减变成卷积的CNN,是因为有3个特性。那么我们在解决问题的时候不能把CNN当作万能的公式,所有全用CNN,需要考虑是否具备3个特性,让CNN使用的话,效果更好。这里从alpha go的问题来解释,为什么下围棋可以用CNN。
1.首先知道围棋的话,其实可以知道,比如出现下面这种三围一的情况就需要加白子,所以这些图案就符合“ 一些图案远比整张图小”这个特性。
2.这种三围一的情况会经常出现,符合“ 同样图案会出现在不同地点”这个特性。
3.最后一种特性其实是“ 缩放改变比例/均匀抽调一些像素,对图片信息不影响”然后就会使用池化来改变图像的大小,那么很显然围棋不适用。
然后看alpha go的论文,因为围棋是19*19的棋盘,所以输入是19*19*48,这个48是结合了领域知识,不是简单的黑白两色。然后进行了补零操作(zero pads)补成了23*23,然后因为围棋一个子的情况5格可以看尽,所以先用了k个5*5的filter,步长是1,激活函数是relu(下面的rectifier nonlinearity)。k的个数是192,选192是因为试过128/256之类的不合适。那么第一次卷积之后就变成了21*21,然后就变了,变成了k个3*3的卷积层,这样的隐藏层有12层,每层都补零。也就是说一共12层,第一层是5*5的核,后面2-12是3*3的核,步长都是1。
我们就会发现,alpha go没有用池化层,上面也说了,围棋不符合第三个特性,所以为了贴合实际问题,进行了改动。这样就很好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值