卷积层如何相互连接?

数据挖掘 机器学习 神经网络 深度学习
2021-09-27 12:03:55

我正在尝试分析 CNN 的架构,我期待它能够被塑造:

  • 输入图像:28 x 28
  • 第一次转化:28 x 28 x nb_filters
  • 第二次转化:28 x 28 x nb_filters x nb_filters

但显然它是这样的:

  • 输入图像:28 x 28
  • 第一次转化:28 x 28 x nb_filters
  • 第二次转化:28 x 28 x nb_filters

我认为第二层中的每个过滤器都将应用于第一层中的每个激活图,从而导致:

  • 第二层之后的激活图 = nb_filters_1st_layer x nb_filters_2nd_layer

如果不是这样,我怎么知道哪些过滤器应用于哪些激活图?

1个回答

原则上有不止一种方法可以做到这一点,但大多数 CNN 和大多数 CNN 库都会执行以下操作:

  • 每层都有一个目标数量的特征图,这就是你标记nb_filters的。

  • 每个特征图都是从所有前一层的特征图派生的。

  • 局部连接的内核的权重确实遵循width x height x nb_input_features x nb_output_features与您的第一个示例类似的结构(宽度和高度是卷积内核的大小),因为 b 层中的每个输出特征都是作为 a 层中每个特征的卷积之和而得出的。

因此,如果您的输出特征图带有(通道)索引 j 在层 k+1I(j,k+1),并且您正在查看与所有输入特征图的连接 Ii(i,k) 在层 k 带有连接每个地图的过滤器 F(i,j,k),那么数学看起来有点像这样:

I(j,k+1)=f(b(j,k)+iI(i,k)F(i,j,k))

. . 。在哪里f(x)是转移或激活函数,例如 ReLU。偏差是b(j,k)表示卷积函数。总结i意味着遍历所有输入通道。注意我已经用这样的上标对所有项目进行了索引,以更清楚地显示所有变量(除了b) 是索引后的矩阵——即这不是特定像素的方程,而是整个特征图的方程。

可以看到内核 F 被索引 (i,j,k)nb_input_features有时nb_output_features过滤器连接每一层。

相比之下,您预期的方案将使派生特征逐层分离,并随着层数的增加而使特征图的数量呈指数增长,并且每个特征“类型”都被单独处理。而在实践中发生的情况是,每个特征图都是前一层中所有特征图的“重新混合”,将每个特征图与自己的过滤器进行卷积,然后求和。

这种层间特征的交叉引用有助于创建更丰富的复杂特征图——例如,它可以结合边缘和角点检测器来检测具有特定角度的角点。虽然将每个特征细化为多个单独的子特征的方案将无法自由地在特征之间进行这种混合(直到后来的全连接层)——尽管它可能在其他任务中表现良好——例如检测扩展结构的变化相同类型的更长的线、曲线等(注意,这只是我的猜测,我不确定)。

如果不是这样,我怎么知道哪些过滤器应用于哪些激活图?

您不能说“第 N 层中的此特征图仅来自第 N-1 层中的另一个特征图,使用此单个过滤器”,因为第 N 层中的每个特征图都来自第 N-1 层中的所有特征图并且过滤器的结果以您无法轻易反转的方式组合在一起。

但是,将排列权重数组,以便您可以找到哪些过滤器将每个输入特征图连接到特定的输出特征图。您将使用哪个维度来隔离这些取决于库。如果您的库以[kernel_width, kernel_height, input_feature_map_id, output_feature_map_id]表格形式存储权重,那么您的选择(可能使用 Numpy 样式的语法)[:,:,:,n]在哪里n是您想要获取过滤器的输出特征映射的 id。