卷积
卷积
3D卷积
深度可分离卷积
稀疏卷积
参考
对于下图所示稀疏的数据,如果使用传统的滑动窗口卷积,会产生大量的无效运算(和数据0相乘和相加),为此系数卷积采用查找构建输入输出Hash table再查表卷积的方式,避免了无效的运算。
数据定义
稀疏信号是采用数据列表和索引列表表示的;对于下图中输入,只有P1和P2处有数据(也被称为active input site),则其索引列表是[1, 2]和[2, 3],并且是YX顺序。
卷积核定义
假设卷积核为(Cin, 3, 3, Cout)=(3,3,3,2)
输出定义
对于稀疏卷积的输出,有两种类型:
- Sparse Output: 只要kernel覆盖一个active input site,就可以计算output site
- Submanifold Output:只有当kernel的中心覆盖一个active input site时,卷积输出才会被计算
计算过程
构建Input Hash Table和Output Hash Table
\(Hash_{in}\)记录了在输入特征图中,哪些位置有输入数据;
\(Hash_{out}\)则记录了在输出特征图中哪些位置有输出数据。计算方法是一个输入一个输入计算,再结合起来。
\(P_{out}\)到\(Hash_{out}\)是一个合并相同项的过程,\(P_{out}\)在后续过程还会被用到。
构建Rulebook
有了\(Hash_{in}\)和\(Hash_{out}\)之后,据此构建Rulebook
- Pin中每个输入坐标都会产生Pout中一个输出列表,GetOffset是Pin中的输入要产生Pout中对应行的输出,需要乘以Kernel中的哪个位置的权重。之所以要将输入分开来计算是为了保证每次只用权重矩阵中的一个位置的权重生成输出。
- 根据被用到的权重矩阵的位置构建Rulebook,如果某个位置被用到两次,则分行列出,如第1行和第2行的位置(0, -1)就是代表该位置的权重被用到两次。
- Rulebook中的Vin表示该权重用到了Input Hash Table中的哪个输入,Vout表示得到的输出位于Output Hash Table中的第几个位置的坐标;
- 如果V_out中有相同的数字,则叠加起来即可。
计算过程
遍历Rulebook,找到需要用到的权重,去乘以Vin指向的输入数据,将输出放置到Vout指向的位置。