我已阅读有关组参数的文档:
组(g)[默认1]:如果g> 1,我们将每个过滤器的连接限制为输入的子集。具体来说,输入和输出通道分为g组,第i个输出组通道仅连接到第i个输入组通道。
但首先,我并不完全明白他们的意思。其次,我为什么要使用它。有人能帮我解释一下吗?
据我所知,它意味着:
如果我将g设置为大于1,则输入和输出通道将分组。但究竟是怎么做到的?如果我将它设置为20并且我的输入为40,那么我将需要20个组?如果输出为50,我将有一组20和一组30?
答案 0 :(得分:9)
其次,为什么我会使用[分组]?
这最初是作为论文中的优化提出的,它引发了当前神经网络普及的周期:
Alex Krizhevsky,Ilya Sutskever和Geoffrey E. Hinton。 " Imagenet classification with deep convolutional neural networks&#34。在神经信息处理系统的进展中,第1097-1105页。 2012。
图2显示了如何将分组用于该工作。 caffe的作者最初添加了这种能力,因此他们可以复制AlexNet架构。然而,在其他情况下,分组继续表现为有益。
例如Facebook和Google都发布了一些论文,这些论文基本上表明分组可以大大减少资源使用,同时有助于保持准确性。可以在这里看到Facebook论文:(ResNeXt),Google论文可以在这里找到:(MobileNets)
答案 1 :(得分:6)
参数给出了组的数量,而不是大小。如果您有40个输入并将g设置为20,那么您将获得20" lanes"每个2个频道;有50个输出,你得到10组2组和10组3。
更常见的情况是,您分成少数组,例如2.在这种情况下,您将拥有两个处理"通道"或团体。对于您提到的40 => 50层,每组将有20个输入和25个输出。每个图层将分成两半,每组前向和后向传播仅在其自己的一半内工作,对于组参数适用的图层范围(我认为它是全部的通往最后一层的方式。)
处理的优势在于,您可以使用2组20 ^ 2个连接,而不是40 ^ 2个输入连接。这使处理速度提高了大约2倍,收敛进度损失很小。
答案 2 :(得分:0)
首先,只有Caffe才能确定行为,而group
是input_channel
和output_channel
的倍数。我们可以从source code进行确认:
CHECK_EQ(channels_ % group_, 0);
CHECK_EQ(num_output_ % group_, 0)
<< "Number of output should be multiples of group.";
其次,参数group
与过滤器参数的数量有关,特别是与过滤器的通道大小有关。
每个过滤器的实际数量为input_channel/group
。也可以从source code中确认:
vector<int> weight_shape(2);
weight_shape[0] = conv_out_channels_;
weight_shape[1] = conv_in_channels_ / group_;
请注意,weight_shape[0]
是申报人的号码。
在Caffe中,如果input_channel
是40,而group
是20:
output_channel
可能不是50。output_channel
为20(请记住,这意味着您有20个过滤器),则每2个输入通道负责一个输出通道。例如,第0个输出通道是从第0个和第1个输入通道计算而来的,与其他输入通道没有任何关系。output_channel
等于input_channel
(即output_channel
= 40),则实际上是众所周知的 depthwise convolution
。每个输出通道仅从一个不同的输入通道计算。我们几乎总是设置group = output_channels
。这是official doc中Deconvolution
层的建议配置:
layer {
name: "upsample", type: "Deconvolution"
bottom: "{{bottom_name}}" top: "{{top_name}}"
convolution_param {
kernel_size: {{2 * factor - factor % 2}} stride: {{factor}}
num_output: {{C}} group: {{C}}
pad: {{ceil((factor - 1) / 2.)}}
weight_filler: { type: "bilinear" } bias_term: false
}
param { lr_mult: 0 decay_mult: 0 }
}
,并遵循以下指示:
通过指定 num_output:{{C}}组:{{C}} ,其行为与 通道级卷积。去卷积层的滤波器形状 将是(C,1,K,K)其中K是kernel_size,并且该填充符将设置 每个(K,K)插值内核的滤波器的每个通道 同样。顶部要素图的最终形状为(B,C, 系数* H,系数* W)。请注意,学习率和权重 衰减设置为0 ,以保持双线性系数值 训练期间插值保持不变。