怎么根据cnn网络的参数和输入图片大小,计算一个cnn网络的输出呢,下面来说明一下
现在做如下假设
- n:表示图像尺寸,比如图像尺寸为n*n*3
- f:表示卷积核尺寸,比如卷积核尺寸为f*f,可以用filter表示卷积核
- s:表示步进,卷积核一次移动多少个像素
- p:表示填充数目,表示一边填充p列像素,2p表示左右各填充p列像素,同样,在行上表示一边填充p行像素,2p表示上下各填充p行像素
于是我们就可以得到如下公式
不填充情况下 步进为1
输出矩阵形状为:(n-f+1)(n-f+1)
比如:n=10, f=3 输出为(10-3+1)=8
不填充情况下 步进大于1
输出矩阵形状为:((n-f)/s+1)((n-f)/s+1)
比如n=10, f=3 s=2输出为(10-3)/2+1)=4
填充 步进为1
如果在不填充原图的情况下,没经过一次cnn,图像就会缩小,可以通过向图像周围填充0,来扩大原图的尺寸,使输入==输出
怎么计算填充呢,如下公式,
输出为(n+2p-f+1)*(n+2p-f+1)
(n+2p-f+1)=n -->p=(f-1)/2
填充 步进为>1
输出为((n+2p-f)/s +1)
公式总结
卷积层中的参数数量
卷积层中的参数数量取决于 filters、kernel_size 和 input_shape 的值。我们定义几个变量:
- K - 卷积层中的过滤器数量
- F - 卷积过滤器的高度和宽度
- D_in - 上一层级的深度
注意:K = filters,F = kernel_size。类似地,D_in 是 input_shape 元组中的最后一个值。
因为每个过滤器有 F*F*D_in 个权重,卷积层由 K 个过滤器组成,因此卷积层中的权重总数是 K*F*F*D_in。因为每个过滤器有 1 个偏差项,卷积层有 K 个偏差。因此,卷积层中的参数数量是 K*F*F*D_in + K。
卷积层的形状,实际使用中的公式
卷积层的形状取决于 kernel_size、input_shape、padding 和 stride 的值。我们定义几个变量:
- K - 卷积层中的过滤器数量
- F - 卷积过滤器的高度和宽度
- H_in - 上一层级的高度
- W_in - 上一层级的宽度
- S-卷积核一次移动像素个数
注意:K = filters、F = kernel_size,以及S = stride。类似地,H_in 和 W_in 分别是 input_shape 元组的第一个和第二个值。
卷积层的深度始终为过滤器数量 K。
如果 padding = ‘same’,那么卷积层的空间维度如下:
- height = ceil(float(H_in) / float(S))
- width = ceil(float(W_in) / float(S))
如果 padding = ‘valid’,那么卷积层的空间维度如下:
- height = ceil(float(H_in - F + 1) / float(S))
- width = ceil(float(W_in - F + 1) / float(S))
np.ceil(4.3)
# 输出5.0
np.ceil(4.6)
# 输出5.0