博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何简单快速地理解卷积
阅读量:3951 次
发布时间:2019-05-24

本文共 2703 字,大约阅读时间需要 9 分钟。

文章目录

一,什么是卷积

对于卷积的定义,如下:

连续形式

( f × g ) ( n ) = ∫ − ∞ ∞ f ( τ ) g ( n − τ ) d τ (f×g)(n)=\int_{-\infty}^{\infty}f(\tau )g(n-\tau)d\tau (f×g)(n)=f(τ)g(nτ)dτ

离散形式

( f × g ) ( n ) = ∑ τ = − ∞ ∞ f ( τ ) g ( n − τ ) (f×g)(n)=\sum_{\tau=-\infty}^{\infty}f(\tau)g(n-\tau) (f×g)(n)=τ=f(τ)g(nτ)

先对g函数进行翻转,相当于在数轴上把g函数从右边褶到左边去,也就是卷积的“卷”的由来。

然后再把g函数平移到n,在这个位置对两个函数的对应点相乘,然后相加,这个过程是卷积的“积”的过程。

上述公式中有一个共同的特征:

n = τ + ( n − τ ) n=\tau + (n - \tau) n=τ+(nτ)

对于这个特征,我们可以令 x = τ x=\tau x=τ, y = n − τ y=n-\tau y=nτ,那么x+y=n就是一些直线

如果遍历这些直线,就好比,把毛巾沿着角卷起来:

二,通俗易懂的理解卷积

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 ) = ∑ m = 1 3 f ( m ) g ( 4 − m ) (f×g)(4)=\sum_{m=1}^{3}f(m)g(4-m) (f×g)(4)=m=13f(m)g(4m)

2.2 连续卷积的例子:做馒头

问题:

如果有一家包子铺,会生产包子,但是包子会坏掉,那么一天后包子总共坏掉了多少?

表示:

假设包子生产速度是f(t),对于包子铺一天生产的包子数量是

∫ 0 24 f ( t ) d t \int_{0}^{24}f(t)dt 024f(t)dt
假设腐败速度是g(t),那么n个包子生产出来后,24小时会腐败个数
n ∗ g ( t ) n * g(t) ng(t)

结果:

一天后,包子总共腐败了:

∫ 0 24 f ( t ) g ( 24 − t ) d t \int_{0}^{24}f(t)g(24-t)dt 024f(t)g(24t)dt

2.3 卷积提取图像特征

卷积核和图像进行点乘(dot product), 就代表卷积核里的权重单独对相应位置的Pixel进行作用

这里我想强调一下点乘,虽说我们称为卷积,实际上是位置一一对应的点乘,不是真正意义的卷积

比如图像位置(1,1)乘以卷积核位置(1,1),仔细观察右上角你就会发现了

例如:对于一张图片

我们进行手动卷积

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()])#totensor 得到(C*H*W)im = transform(img)def imshow(img):    npimg = img    plt.imshow(np.transpose(npimg,(1,2,0))) #chw->hwc    plt.show()k = torch.ShortTensor([[0,-4,0],[-4,16,-4],[0,-4,0]])stride=2 #步长padding=0 # 补0f = 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)

提取特征效果如下:

部分内容参考

转载地址:http://rbgwi.baihongyu.com/

你可能感兴趣的文章
Android电源管理相关应用技巧分享
查看>>
Android录音失真具体解决方案
查看>>
Android根文件系统相关应用介绍
查看>>
Android文件系统深入剖析
查看>>
Android判断网络状态方法详解
查看>>
在Android上实现Junit单元测试的四部曲
查看>>
有效控制Android应用程序的耗电量
查看>>
Android术语列表概览
查看>>
全方位解读Android多媒体框架源码
查看>>
Android音乐编程的管理音频硬件
查看>>
Android UI控件组合应用之一:建立数据模型
查看>>
避免Andriod平台图片失真的图片形式
查看>>
Android之Gridview图片列表
查看>>
objdump的使用方法
查看>>
编译错误处理noproguard.classes-with-local.dex已杀死
查看>>
LTE - CSFB技术
查看>>
GSM链路层信令协议
查看>>
技术道德
查看>>
“需求为王”才是根本
查看>>
高效率的危害
查看>>