空洞卷积(Dilated Convolutions)

在深度学习中,我们常见的就是卷积神经网络。这篇博客来给大家介绍一下空洞卷积跟普通卷积的区别。

空洞卷积的应用处:空洞卷积(dilated convolution)是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。利用添加空洞扩大感受野,让原本3x3的卷积核,在相同参数量和计算量下拥有5x5(dilated rate =2)或者更大的感受野,从而无需下采样。扩张卷积(dilated convolutions)又名空洞卷积(atrous convolutions),向卷积层引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时各值的间距。换句话说,相比原来的标准卷积,扩张卷积(dilated convolution) 多了一个hyper-parameter(超参数)称之为dilation rate(扩张率),指的是kernel各点之前的间隔数量,[正常的convolution 的 dilatation rate为 1]。

空洞卷积(Dilated Convolutions)_第1张图片

由上图可见,普通卷积就是特殊的空洞卷积。空洞卷积只是引入了一个“扩张率”的概念。

现在上代码来看看他们之间的区别吧!

编译环境:jupyter notebook

1.导入包

import numpy as np
import torch
import torch.nn as nn

2.生成一个一维数组

arr = np.array(range(1,26))
arr

空洞卷积(Dilated Convolutions)_第2张图片
3.将一维数组转化为一个二维数组

arr.shape(5,5)
arr

空洞卷积(Dilated Convolutions)_第3张图片
4.增加一个dim,为通道

arr = np.expand_dims(arr,2)
arr

空洞卷积(Dilated Convolutions)_第4张图片
这里可能有些困难,不了解np中expand_dims()这个函数的可能看不懂这里,我会在下文做出解释。
5.读取现在矩阵的长度

arr.shape

运行结果为 (5,5,1)
6.轴变化

arr = arr.transpose((2,0,1))#轴变化
arr
arr.shape

运行结果(1,5,5)
空洞卷积(Dilated Convolutions)_第5张图片
7.将numpy形式转化为tensor格式

arr = torch.Tensor(arr)
print(arr)

空洞卷积(Dilated Convolutions)_第6张图片
8.增加一个fake batch dimension

arr = arr.unsqueeze(0)
print(arr.size())

空洞卷积(Dilated Convolutions)_第7张图片
9.接下来先展示普通卷积

conv1 = nn.Conv2d(1, 1, 3, stride=1, bias=False, dilation=1)
nn.init.constant_(conv1.weight, 1)
out1 = conv1(arr)
out1

空洞卷积(Dilated Convolutions)_第8张图片
10.最后是空洞卷积

conv2 = nn.Conv2d(1, 1, 3, stride=1, bias=False, dilation=2)
nn.init.constant_(conv2.weight, 1)
out2 = conv2(arr)
out2

在这里插入图片描述
空洞卷积(Dilated Convolutions)_第9张图片
这就是空洞卷积和普通卷积的区别,现在补充一下刚刚的函数知识。

补充

np.shape

这个函数它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度。它的输入参数可以使一个整数表示维度,也可以是一个矩阵。

np.expand_dims(a,axis)

其中a指的是numpy矩阵,axis为需要添加纬度的轴
举个例子:
二维数组中
空洞卷积(Dilated Convolutions)_第10张图片
shape中2处于axis=0的位置,3处于axis=1的位置,若在axis=1的位置添加变量,则需在shape中axis=1的位置写1,同时3后移,shape变为(2,1,3)。调用索引时axis=1的位置一直为0

你可能感兴趣的:(卷积,python,深度学习,机器学习,人工智能)