我正在尝试用Python实现一个卷积神经网络。最初,我用的是化学信号的卷积2d函数来完成卷积,但是它有很多开销,而且如果只在C语言中实现自己的算法并从python调用它会更快,因为我知道我的输入是什么样子的。在
我实现了两个功能:具有不可分核矩阵的卷积
用可分离的内核对矩阵进行卷积(现在我假设python在将其传递给C之前进行秩检查和拆分)
这两个函数都没有填充,因为我需要降维。在
不可分离二维卷积// a - 2D matrix (as a 1D array), w - kernel
double* conv2(double* a, double* w, double* result)
{
register double acc;
register int i;
register int j;
register int k1, k2;
register int l1, l2;
register int t1, t2;
for(i = 0; i < RESULT_DIM; i++)
{
t1 = i * RESULT_DIM; // loop invariants
for(j = 0; j < RESULT_DIM; j++)
{
acc = 0.0;
for(k1 = FILTER_DIM - 1, k2 = 0; k1 >= 0; k1--, k2++)
{
t2 = k1 * FILTER_DIM; // loop invariants
for(l1 = FILTER_DIM - 1, l2 = 0; l1 >= 0; l1--, l2++)
{
acc += w[t2 + l1] * a[(i + k2) * IMG_DIM + (j + l2)];
}
}
result[t1 + j] = acc;
}
}
return result;
}
可分离二维卷积
^{pr2}$
使用gcc的-O3标志编译并在2.7GHz Intel i7上测试,使用4000x4000矩阵和5x5内核,我分别得到(平均值为5):271.21900 ms
127.32000 ms
这比化学信号的卷积2d,对于相同的操作大约需要2秒,但是我需要更高的速度,因为我将调用这个函数上千次。将数据类型更改为float目前不是一个选项,尽管这会导致相当大的加速。在
有没有办法可以进一步优化这些算法?我可以应用任何缓存技巧或例程来加速它吗?在
如有任何建议,我们将不胜感激。在