Kaslanarian / FastConv

卷积操作(1d, 2d)的快速实现

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

FastConv

使用NumPy实现1d和2d卷积,直接实现需要多重循环,比如二维卷积的代码:

for i in range(N):
    for j in range(self.out_channels):
        for k in range(h_out):
            for l in range(w_out):
                for m in range(in_channels):
                    for row in range(self.kernel_size):
                        for col in range(self.kernel_size):
                            output[i, j, k,
                                    l] += data[i, m, k * stride + row,
                                                l * stride +
                                                col] * kernel[j, m, row,
                                                            col]

因此我们尝试各种方法,避免NumPy基础卷积操作中的多重循环:样本循环、卷积循环、通道循环,从而加速卷积过程。

Conv1d

  1. 利用scipy.ndimage.correlate1d消除样本循环和卷积循环;
  2. 利用NumPy的广播机制消除样本循环和一部分通道循环;
  3. 利用类似im2col策略消除大部分循环;
  4. 使用im2col+strided策略消除所有循环.

四种方法和baseline的比较(横轴为输入特征数,纵轴为时间的对数,具体实验设置参考test.py,图中的strided就是im2col+strided方法)

1

最优两种方法和PyTorch的对比:

2

Conv2d

  1. 利用scipy.ndimage.correlate消除样本循环和卷积循环;
  2. 利用NumPy的广播机制消除样本循环和一部分通道循环;
  3. 利用im2col策略消除所有循环。
  4. ...

Reference(Updating)

About

卷积操作(1d, 2d)的快速实现


Languages

Language:Python 100.0%