【神经网络】卷积层输出大小计算(长、宽、深度)
先定义几个参数
- 输入图片大小 W×W
- Filter大小 F×F
- 步长 S
- padding的像素数 P
于是我们可以得出
N = (W − F + 2P )/S+1
输出图片大小为 N×N
转载:
卷积中的特征图大小计算方式有两种,分别是‘VALID’和‘SAME’,卷积和池化都适用,除不尽的结果都向上取整。
1.如果计算方式采用'VALID',则:
其中为输出特征图的大小,为输入特征图的大小,F为卷积核大小,stride为卷积步长。
2.如果计算方式采用'SAME',输出特征图的大小与输入特征图的大小保持不变,
其中padding为特征图填充的圈数。
若采用'SAME'方式,kernel_size=1时,padding=0;kernel_size=3时,padding=1;kernel_size=5时,padding=3,以此类推。
tensorflow代码(Tensorflow官方文档)中:
w_conv1=weight_variable([5,5,1,32]),一直不明白这个32是怎么来的,表示的是什么?
后来看到cs231n-知乎课程翻译的卷积神经网那一章的一段话:
参数共享:在卷积层中使用参数共享是用来控制参数的数量。就用上面的例子,在第一个卷积层就有55x55x96=290,400个神经元,每个有11x11x3=364个参数和1个偏差。将这些合起来就是290400x364=105,705,600个参数。单单第一层就有这么多参数,显然这个数目是非常大的。
作一个合理的假设:如果一个特征在计算某个空间位置(x,y)的时候有用,那么它在计算另一个不同位置(x2,y2)的时候也有用。基于这个假设,可以显著地减少参数数量。换言之,就是将深度维度上一个单独的2维切片看做深度切片(depth slice),比如一个数据体尺寸为[55x55x96]的就有96个深度切片,每个尺寸为[55x55]。在每个深度切片上的神经元都使用同样的权重和偏差。在这样的参数共享下,例子中的第一个卷积层就只有96个不同的权重集了,一个权重集对应一个深度切片,共有96x11x11x3=34,848个不同的权重,或34,944个参数(+96个偏差)。
可以看出,上面的32表示的是卷积层输出的深度,因为大家都明白width和height都可以通过公式计算得到,但是很多文献都没有告诉深度是如何得到的,下面是我的认识:
1. 因为这个深度是没有公式可以计算出来的,因为深度是一个经验值,如上面代码的32 ,其实是一个经验值,是通过调整参数发现32是一个最合适的值,可以得到最好的准确率,但是不同的图像的深度是不一样的。
2.这个深度表示用了多少个卷积核,下面这个图可以说明一下:
上图就可以很有效的说明 :卷积层输出的深度==卷积核的个数。