C++卷积计算实现

张一极

如果是全连接的nerual network,输入是img(100*100),其参数,100 x 100 x 3,每个通道含有100x100的参数量,三个通道,第一层的nerual network假设为1000个nerual,第一层的参数量为30000 x 1000,所以引入了卷积,有目的地放弃一些权重,卷积其实可以看作,放弃了一部分权重的dnn,那么它对应的反向传播,只需要在最终的upload的结果上,不更新某一些参数即可,具体的后续实现会进行记录。

卷积作为一种拟合,把图像矩阵每一部分都变换成一个新的值,其核心就是权重的封装:

filter的四个数据,通过不断刷新去获取最合适的四个值:

image-20200417154711154

运算的具体过程是这样的:(stride = 1)

image-20200417155643738

每一次卷积都是使用等同于卷积核大小的尺寸数据进行计算,也就是黄色区域每一个像素乘以卷积核对应位置的每一个参数:

image-20200417161144994

image-20200417162127544

output:

cnn中的卷积方式不止有这一种,另外两种方式分别是:

1.(mode = full)从卷积核的第一个卷积接触到的element进行直接卷积:

image-20200418153936720

2.(mode = same)

image-20200418154257098

第三种就是最普遍的情况:

image-20200418154354652


代码实现,mode = 0:

假设rgb:

卷积核是1x1的3x3,输出如下: