1.什么是卷积 对于卷积的定义,如下:
连续形式
$$(f×g)(n)=\int_{-\infty}^{\infty}f(\tau )g(n-\tau)d\tau$$
离散形式
$$(f×g)(n)=\sum_{\tau=-\infty}^{\infty}f(\tau)g(n-\tau)$$
先对g函数进行翻转,相当于在数轴上把g函数从右边褶到左边去,也就是卷积的“卷”的由来。 然后再把g函数平移到n,在这个位置对两个函数的对应点相乘,然后相加,这个过程是卷积的“积”的过程。
上述公式中有一个共同的特征: $$n=\tau + (n - \tau)$$
对于这个特征,我们可以令$x=\tau$,$y=n-\tau$,那么x+y=n就是一些直线
如果遍历这些直线,就好比,把毛巾沿着角卷起来:
2.通俗易懂的理解卷积 2.1离散卷积的例子:丢骰子 问题:
把两枚骰子抛出去,两枚骰子点数之和为4的概率是多少
表示:
如果用f(x)表示第一枚骰子投出x(x∈{1,2,3,4,5,6})的概率,g(y)表示第二枚骰子投出y(y∈{1,2,3,4,5,6})的概率
结果:
两枚骰子点数加起来等于4的情况有: f(1)g(3)和f(2)g(2)和f(3)g(1)
那么概率为P=f(1)g(3)+f(2)g(2)+f(3)g(1),符合卷积的定义,把他写成标准形式就是 $$(f×g)(4)=\sum_{m=1}^{3}f(m)g(4-m)$$
2.2连续卷积的例子:做馒头 问题:
如果有一家包子铺,会生产包子,但是包子会坏掉,那么一天后包子总共坏掉了多少?
表示:
假设包子生产速度是f(t),对于包子铺一天生产的包子数量是 $$\int_{0}^{24}f(t)dt$$ 假设腐败速度是g(t),那么n个包子生产出来后,24小时会腐败个数 $$n * g(t)$$
结果:
一天后,包子总共腐败了: $$\int_{0}^{24}f(t)g(24-t)dt$$
2.3卷积提取图像特征
卷积核和图像进行点乘(dot product), 就代表卷积核里的权重单独对相应位置的Pixel进行作用
这里我想强调一下点乘,虽说我们称为卷积,实际上是位置一一对应的点乘,不是真正意义的卷积
比如图像位置(1,1)乘以卷积核位置(1,1),仔细观察右上角你就会发现了
例如:对于一张图片
我们进行手动卷积
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 import cv2import torch,torchvisionfrom torchvision import transformsimport matplotlib.pyplot as pltimport numpy as npfrom PIL import Imageimport mathpath="./1.jpg" img = Image.open (path) transform = transforms.Compose([transforms.ToTensor()]) im = transform(img) def imshow (img ): npimg = img plt.imshow(np.transpose(npimg,(1 ,2 ,0 ))) plt.show() k = torch.ShortTensor([[0 ,-4 ,0 ],[-4 ,16 ,-4 ],[0 ,-4 ,0 ]]) stride=2 padding=0 f = k.size(0 ) channels = im.size(0 ) hin = im.size(1 ) win = im.size(2 ) hout = math.floor((hin-f+2 *padding)/stride+1 ) wout = math.floor((win-f+2 *padding)/stride+1 ) print ("input[{},{}],output[{},{}]" .format (hin,win,hout,wout))output=[] im = im.numpy() k = k.numpy() print ("Waite for calculating..." )for i in range (channels): lines=[] for j in range (hout): line=[] for n in range (wout): a=[[im[i][j*stride][n*stride],im[i][j*stride][n*stride+1 ],im[i][j*stride][n*stride+2 ]],[im[i][j*stride+1 ][n*stride],im[i][j*stride+1 ][n*stride+1 ],im[i][j*stride+1 ][n*stride+2 ]],[im[i][j*stride+2 ][n*stride],im[i][j*stride+2 ][n*stride+1 ],im[i][j*stride+2 ][n*stride+2 ]]] line.append(sum (sum (a*k))) lines.append(line) output.append(lines) oo=np.array(output) print (oo.shape)imshow(oo)
提取特征效果如下:
部分内容参考知乎:如何通俗易懂的理解卷积