keras中卷积核维数与输入维数的关系

来源:互联网 发布:教育软件 编辑:程序博客网 时间:2024/06/06 01:30
         里面如果有错的话,还望指正,谢谢。
在使用keras的卷积层时,需要选择卷积核的维数,对应的函数分别为Conv1D和Conv2D等,刚开始使用时一直没搞明白为啥输入图像是3维的RGB图像,但是在配置卷积层时却选择Conv2D函数,而不是Conv3D,后来看keras的源码,才知道原因(我等菜鸟还是要多看源码才能进步。。)
        在keras.layers中的convolutional.py中,基类函数_Conv中卷积核的尺寸是kernel_shape,可以看到代码中:

kernel_shape = self.kernel_size + (input_dim, self.filters)

        self.kernel_size由conv_utils.normalize_tuple函数得到,该函数根据输入的参数返回一个元组,参数分别是:kernel_size, rank,  'kernel_size'。

1、kernel_size是卷基层中人为指定的,可能为元组,也可能是一个整数,用于确定返回的元组kernel_size中元素的值;

2、rank为卷积核的维数https://www.zhihu.com/question/21605094,第一个回答把秩的概念将的非常清楚,厉害),也是一个输入时确定的参数,但是在继承类中都已经指定了。用于确定返回的元组中kernel_size的大小;

3、'kernel_size'仅仅用于报错时指出错误。


       例如在使用Conv2D时,假设设置的kernel_size =3,或者(3,3),rank已经设定为2,则返回的 self.kernel_size=(3,3)

       等式的第二个部分是一个元组, (input_dim, self.filters)分别表示输入数据的维度和卷积核的个数,两个元组相加,得到最终的卷积核的shape。例如在输入为RGB图像时,input_dim=3(由输入参数input_shape得出),filters=64,则:

       kernel_shape = self.kernel_size + (input_dim, self.filters)=(3,3,3,64)
        
        因此在计算参数个数时,若输入尺寸为W*H*D,卷积核移动步长为s,同时padding,保持输入输出的W和H不变,考虑偏置项b,卷积核大小为(k,k),卷积核个数为n,则此时卷积层需要确定的参数个数为:n*(k*k*D+1),参数个数就与输入图像的大小就无关啦,少了很多参数,因此上述例子中参数个数为64*(3*3*3+1),括号中前面的27为卷积核的参数,后面的加1为偏置项b。总的连接数为:[(W-k+2*padding)/s+1]*[(H-k+2*padding)/s+1]*n*(k*k*D+1)(这里的偏置项不知道算不算是连接的一部分),(W-k+2*padding)/s+1和(H-k+2*padding)/s+1得到输出的大小
        里面如果有错的话,还望指正,谢谢。
原创粉丝点击