原则上有不止一种方法可以做到这一点,但大多数 CNN 和大多数 CNN 库都会执行以下操作:
因此,如果您的输出特征图带有(通道)索引 j 在层 k+1 是 I(j,k+1),并且您正在查看与所有输入特征图的连接 I(i,k)i 在层 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。