最近完成了hinton的深度学习课程的卷积和池化的这一章节了,马上就要结束了。这个课程的作业我写的最有感受,待我慢慢说来。
1:里面有几个理解起来的难点,一个是卷积,可以这么来理解。
这幅图是对一个5*5的矩阵A进行3*3的矩阵B的卷积,那么就从最上角到右下角,生成卷积之后的矩阵的大小是(5-3+1)*(5-3+1)的矩阵,生成之后的矩阵的元素值,是之前的两个矩阵对应元素的乘积之和,这个在matlab中有现成的命令,但是用之前需要注意下,比如在图中这样的B的话要首先进行B中元素左右和上下的对调才可以满足右侧矩阵的结果。这个是matlab中进行卷积计算的命令要求的,并且这个命令还有第三个参数,如图中使用的是valid参数值,具体的用法还请doc来了解吧。
2:说下池化,其实池化很容易理解,先看图:
比如上方左侧矩阵A是20*20的矩阵要进行大小为10*10的池化,那么左侧图中的红色就是10*10的大小,对应到右侧的矩阵,右侧每个元素的值,是左侧红色矩阵每个元素的值得和再处于红色矩阵的元素个数,也就是平均值形式的池化。
3:上面说了下卷积和池化,再说下计算中需要注意到的。在代码中使用的是彩色图,彩色图有3个通道,那么对于每一个通道来说要单独进行卷积和池化,有一个地方尤其是进行卷积的时候要注意到,隐藏层的每一个值是对应到一幅图的3个通道穿起来的,所以分3个通道进行卷积之后要加起来,正好才能对应到一个隐藏层的神经元上,也就是一个feature上去。
ps:在做这个实验的过程中,遇到了个2B的问题。我的代码中对convolution和pooling的check都过去了,但是准确率只有25%,反正中间使用了很多方法来找我的错误,最后都没找到,最终和同学的代码对比,一个文件一个文件的替换来跑(为了快速找到问题,把数据规模以及隐藏层的个数都调小了的),最终发现是池化的时候的问题,我把问题原因贴在这里,在池化的过程中,代码应该是这样子的:
而我写成了(注意红色部分)
但是这个代码被check过了没问题,我去看了下check的代码,这个代码是给出的:
也就是这个测试矩阵的features为1,numImages也是1,所以在我的代码中这个问题正好被隐藏掉了,导致我的check是显示congratulations的,因为也导致我就压根没想到是这个地方错误的。。
以后变量名一定要注意,不要弄如此类似的了,一不小心就搞错了,还有不要太相信这个里面的check的代码了,有错误还是多仔细检查每一个步骤,并且check的代码起码也要具备共性才有说服力!