【问题标题】:caffe: What does the **group** param mean?caffe:**group** 参数是什么意思?
【发布时间】:2017-04-13 20:44:29
【问题描述】:

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

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

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

据我理解,意思如下:

如果我将 g 设置为大于 1,我的输入和输出通道将分成组。但是具体是怎么做的呢?如果我将它设置为 20 并且我的输入是 40,我将不得不 20 组?如果输出为 50,我将有一组 20 和一组 30?

【问题讨论】:

  • 如果你在一个卷积层中设置group = 2,这个层会被分成2个独立的分支(从输入到输出),层的输出由2个分支的卷积结果组成。
  • 好的,谢谢,但最后我是否使用 group 并没有什么不同。只是为了更快的计算时间? @戴尔

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


【解决方案1】:

参数给出了组的数量,而不是大小。如果您有 40 个输入并将 g 设置为 20,您将获得 20 个“通道”,每个通道有 2 个;如果有 50 个输出,您将获得 10 组 2 组和 10 组 3 组。

更多情况下,您会分成少数几个组,例如 2 个。在这种情况下,您将有两个处理“通道”或组。对于您提到的 40=>50 层,每组将有 20 个输入和 25 个输出。对于 group 参数适用的层范围,每一层将分成两半,每组前向和后向传播仅在其自己的一半内工作(我认为一直到最后层)。

处理优势在于,您有 2 组 20^2 连接,而不是 40^2 输入连接,或者是原来的一半。这将处理速度提高了大约 2 倍,收敛过程中的损失非常小。

【讨论】:

  • 我看到有人在反卷积层中设置了 group = num_output。人们为什么要这样做?
  • 如果我只是省略 group 参数会有很大的不同吗? @Prune
  • 我有一个带有Deconvolution 层的网络。如果我设置 group = num_output 我的网络收敛,如果我省略 group 参数它不会收敛。你能解释一下吗? @Prune
  • 这看起来像是可视化调试工具的工作。如果不详细查看拓扑结构和对培训进展进行一些良好的可视化,我将无能为力。您是否对中间层应用了任何可视化工具来检查收敛差异出现在哪里?
  • 我可以从数据中做出一些明显的猜测,但这更像是人类的反向传播,而不是任何真正的理解。 group = num_output 会很快收敛你的网络,因为每个通道都会很快收敛到它的简单结果。问题是这种收敛是否能够真正解决您的预测问题。
【解决方案2】:

其次,我为什么要使用[分组]?

这最初是作为引发当前神经网络流行周期的论文中的优化提出的:

Alex Krizhevsky、Ilya Sutskever 和 Geoffrey E. Hinton。 “Imagenet classification with deep convolutional neural networks。”在神经信息处理系统的进展中,第 1097-1105 页。 2012.

图 2 显示了分组是如何用于这项工作的。 caffe 的作者最初添加了此功能,以便他们可以复制 AlexNet 架构。然而,分组在其他情况下继续显示其自身优势。

例如,Facebook 和 Google 都发布了论文,这些论文基本上表明分组可以显着减少资源使用,同时有助于保持准确性。 Facebook 论文可以在这里看到:(ResNeXt),Google 论文可以在这里找到:(MobileNets)

【讨论】:

  • 嗯,我不太确定。我有一个网络,在我的Deconvolution-param 我使用 group = num_output 这使我的网络收敛。如果我省略了组标签,它就不会再收敛了......或者至少没有那么快(可能没有训练足够长的时间)@Martin Thoma
  • @thigi 我已经链接了一篇你可能感兴趣的论文。
  • 这个答案其实很有用。它不应该被否决。
  • @MartinThoma:感谢您的参考。在论文中,如何表示反卷积层的组参数?
【解决方案3】:

首先,当groupinput_channeloutput_channel 的倍数时,Caffe 确定行为。我们可以通过source code 确认这一点:

CHECK_EQ(channels_ % group_, 0);
CHECK_EQ(num_output_ % group_, 0)
  << "Number of output should be multiples of group.";

其次,参数group与filter参数的个数有关,具体来说与filter的通道大小有关。 每个过滤器的实际数量为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]是filer的编号。


所以,w.r.t 你的问题:

在 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}} group: {{C}},它的行为如下 通道卷积。这个反卷积层的滤波器形状 将是 (C, 1, K, K),其中 K 是 kernel_size,并且此填充符将设置 滤波器每个通道的 (K, K) 插值内核 同样。顶部特征图的最终形状将是 (B, C, 因数 * H,因数 * W)。注意学习率和权重 衰减设置为 0 以保持双线性的系数值 训练期间插值不变。

【讨论】:

    猜你喜欢
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2016-10-17
    • 2015-03-05
    • 2014-05-31
    • 2012-09-16
    相关资源
    最近更新 更多