前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度学习 | 如何理解卷积

深度学习 | 如何理解卷积

作者头像
Justlovesmile
发布2021-12-14 10:02:51
1.4K0
发布2021-12-14 10:02:51
举报
文章被收录于专栏:云+分享

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),仔细观察右上角你就会发现了

例如:对于一张图片

我们进行手动卷积

代码语言:javascript
复制
import cv2
import torch,torchvision
from torchvision import transforms
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import math

path="./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 # 补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)

提取特征效果如下:

部分内容参考知乎:如何通俗易懂的理解卷积

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.什么是卷积
  • 2.通俗易懂的理解卷积
    • 2.1离散卷积的例子:丢骰子
      • 2.2连续卷积的例子:做馒头
        • 2.3卷积提取图像特征
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档