caffe:**组** param是什么意思?

时间:2016-11-29 18:15:29

标签: deep-learning caffe conv-neural-network

我已阅读有关参数的文档:

  

组(g)[默认1]:如果g> 1,我们将每个过滤器的连接限制为输入的子集。具体来说,输入和输出通道分为g组,第i个输出组通道仅连接到第i个输入组通道。

但首先,我并不完全明白他们的意思。其次,我为什么要使用它。有人能帮我解释一下吗?

据我所知,它意味着:

如果我将g设置为大于1,则输入和输出通道将分组。但究竟是怎么做到的?如果我将它设置为20并且我的输入为40,那么我将需要20个组?如果输出为50,我将有一组20和一组30?

3 个答案:

答案 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才能确定行为,而groupinput_channeloutput_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:

  1. output_channel可能不是50。
  2. 如果output_channel为20(请记住,这意味着您有20个过滤器),则每2个输入通道负责一个输出通道。例如,第0个输出通道是从第0个和第1个输入通道计算而来的,与其他输入通道没有任何关系。
  3. 如果output_channel等于input_channel(即output_channel = 40),则实际上是众所周知的 depthwise convolution 。每个输出通道仅从一个不同的输入通道计算。

w.r.t反卷积:

我们几乎总是设置group = output_channels。这是official docDeconvolution层的建议配置:

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 ,以保持双线性系数值   训练期间插值保持不变。