Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 卡在CNN矩阵大小的计算中_Math_Deep Learning_Classification_Conv Neural Network - Fatal编程技术网

Math 卡在CNN矩阵大小的计算中

Math 卡在CNN矩阵大小的计算中,math,deep-learning,classification,conv-neural-network,Math,Deep Learning,Classification,Conv Neural Network,在我的CNN二进制分类体系结构中,我有2个卷积层、2个maxpooling层、2个batchnormalization操作、1个RELu和1个fullyconnected层 Case1:当通道数d=1:在第一层中,输入大小[28*28*d],d=1通道与M\u 1=20应用于所有输入通道的滤波器数(f_h x f\u w x d)=[3x 3x1创建大小为{(h-f_h+1)x(w-f_w+1)x d x M_1}=(28-3+1)x(28-3+1)x1x20=[25x25x20] 第二个卷积层

在我的CNN二进制分类体系结构中,我有2个卷积层、2个maxpooling层、2个batchnormalization操作、1个RELu和1个fullyconnected层

Case1:当通道数
d=1
:在第一层中,输入大小
[28*28*d]
d=1
通道与
M\u 1=20
应用于所有输入通道的滤波器数
(f_h x f\u w x d)=[3x 3x1创建大小为
{(h-f_h+1)x(w-f_w+1)x d x M_1}
=
(28-3+1)x(28-3+1)x1x20=[25x25x20]

第二个卷积层包含两倍数量的相同大小的过滤器=40。因此,作为第二卷积层的输出,参数的数量变为
[23*23*1*40]
。因此,参数总数=
[25x25x20]+[23*23*40]

情况2:当
d=2
和所有其他尺寸相同时。过滤器大小变为
[3 x 3 x 2]
。第一个卷积层的输出将包含:
(28-3+1)x(28-3+1)x2x20=[25x25x40]

对于第二个卷积层,输出将包含
[23 x 23 x 2 x 40]
参数


问题)我对上述每种情况的计算是否正确?全连接层的输入是什么?

在卷积层中,滤波器中的通道数保持等于输入的通道数。此外,滤波器中通道的数量不会影响输出的大小。输出的大小由以下公式给出:

height = (input_height - filter_height + 1) (Assuming no padding and stride = 1)
width = (input_width - filter_width + 1)
channels = no. of filters
关于你的问题:

案例1(d=1):

转换层#1

上述输出将成为第二个卷积层的输入,这将导致:

转换层#2

案例2(d=2): 在这种情况下,两个conv层的输出也将与上述相同,因为输出不依赖于通道的数量

转换层#1

转换层#2


希望这有帮助

有几个错误。第一个是微不足道的,它与第一层的输出大小有关,因为它应该是
26x26x20
而不是
25x25x20
,因为如果内核大小为
3
,而不加填充,则会使每个边缘仅丢失一个像素

推理中更重要的问题发生在计算第二个卷积层的参数数量时。普通的卷积要求你也要考虑深度:假设你有一个卷积层,有<代码> M< /代码>输出特征图<代码> fy1,…,fym 和大小<代码> H*W*d的输入。我们还假设卷积核是空间维度的
k*k
。然后,任何输出映射中的像素
x
,例如,
f_j
,将是大小
h*w*d
的输入和大小
k*k*d
的内核之间的
3d
卷积的结果。因此,卷积层具有
k*k*d*m
参数。这意味着在您的情况下:

input of layer: 26x26x20
number of filters in layer: 40
number of parameters: 26x26x20x40

关于你对
d=2
的推理也可以这样说:第二次卷积将有
20x40
输出映射,而不是
2x40

非常感谢你的回答。我有两个问题,你能澄清一下吗?(1)你能同时提到参数的数量吗?(2) 此外,拥有maxpooling层是否会影响这些数字?我已经读到maxpooling降低了维度,在我的例子中,在每个conv.层之后有2个maxpooling层。每个MaxPool的大小为3,步幅为2。如果你能解释这两点,我将不胜感激。谢谢你回答问题的另一部分——参数的数量。有点不清楚,你能详细说明这两个案例的每个步骤吗?另外,maxpooling会影响这些数字吗?我有两个maxpooling层。在我的例子中,每个maxpooling的大小为3,跨步为2。@Sm1 maxpooling本身没有任何参数。如果将其放置在卷积层之间,将减少第二次卷积中必要参数的数量。我认为对你来说,理解所有这些的最好方法是通过你正在使用的深度学习框架(例如,某种类型的parameters()函数)找到参数的数量。请注意,大多数框架在卷积中默认情况下都会假定有偏差,因此您可能有一个额外的参数。
Input : 26 x 26 x 20, Filter : 3 x 3 x 20, #filters : 40 (You mentioned size of filter as 3x3x1, but it should be 3x3x20 since the no. of filter channels = no. of input channel)
Output for this layer : (26-3+1) x (26-3+1) x #filters = 24 x 24 x 40
Input : 28 x 28 x 2, Filter : 3 x 3 x 2, #filters : 20
So your output becomes (28-3+1) x (28-3+1) X #filters = 26 x 26 x 20
Input : 26 x 26 x 20, Filter : 3 x 3 x 20, #filters : 40
Output for this layer : (26-3+1) x (26-3+1) x #filters = 24 x 24 x 40
input of layer: 26x26x20
number of filters in layer: 40
number of parameters: 26x26x20x40