im2col在卷积神经网络中的具体应用

我们在DEEPLab的网络中提到了利用im2col来加速,但是im2col如何作用到卷积神经网络的。

我看了http://cs231n.github.io/convolutional-networks/#convert

im2col在卷积神经网络中的具体应用

了解了一二,先写下来,当作笔记。

卷积的filter一般情况下是二维矩阵,比如11*11*3,我们将其转换成11*11*3=363的向量,由于一个filter产生一个输出,所以我们可以说这个输出的感受野是363,因为看到了363个像素,通过filter。于是我们总共有,size(output).pixels*363这个大小的im2col 命名为X_col矩阵。感受野之间是有重复的,因为stride等于1,如果每个filter不去卷积重复的块,那自然也没有重复的。

然后,如果我们有96个filters,那就有一个W_col矩阵,大小是(363*96).

这两个矩阵,有什么用呢。作用就是,现在你可以用矩阵的乘法来作用于(W_col,X_col),这个乘法就相当于我们的filter迭代的去卷积了。然而事实上时间复杂度并没有改变啊,不过有个优点就是它具有了矩阵乘法的性质,这样线性代数上的所有技巧我们都可以不假思索的用在这里,是不是很棒棒?注意这个size(output).pixels=output.W*output.H,所以我们还要reshape回去到三个维度上。W*H*96.

缺点就是如果你的stride很小,那么X_col里面有很多重复的元素,这就导致了不必要的存储空间,优点不出我所料,就是利用了矩阵乘法这个已经被数学家研究透了的东西,能够增加效率。作者举了个栗子,就是BLAS。

在pooling时候我们还可以借助im2col。

因为pooling和conv是一样的。都是一个filter出一个位置的像素。如果是average像之前那样直接矩阵乘法,max的话就需要动下老筋,怎么做矩阵乘法能够求出最大值。两个的可以加减法来做,多个的话鸽了,等我看到在更。

好了完。