在深度学习中,我们常见的就是卷积神经网络。这篇博客来给大家介绍一下空洞卷积跟普通卷积的区别。
空洞卷积的应用处:空洞卷积(dilated convolution)是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。利用添加空洞扩大感受野,让原本3x3的卷积核,在相同参数量和计算量下拥有5x5(dilated rate =2)或者更大的感受野,从而无需下采样。扩张卷积(dilated convolutions)又名空洞卷积(atrous convolutions),向卷积层引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时各值的间距。换句话说,相比原来的标准卷积,扩张卷积(dilated convolution) 多了一个hyper-parameter(超参数)称之为dilation rate(扩张率),指的是kernel各点之前的间隔数量,[正常的convolution 的 dilatation rate为 1]。
由上图可见,普通卷积就是特殊的空洞卷积。空洞卷积只是引入了一个“扩张率”的概念。
现在上代码来看看他们之间的区别吧!
编译环境:jupyter notebook
1.导入包
import numpy as np
import torch
import torch.nn as nn
2.生成一个一维数组
arr = np.array(range(1,26))
arr
3.将一维数组转化为一个二维数组
arr.shape(5,5)
arr
4.增加一个dim,为通道
arr = np.expand_dims(arr,2)
arr
这里可能有些困难,不了解np中expand_dims()这个函数的可能看不懂这里,我会在下文做出解释。
5.读取现在矩阵的长度
arr.shape
运行结果为 (5,5,1)
6.轴变化
arr = arr.transpose((2,0,1))#轴变化
arr
arr.shape
运行结果(1,5,5)
7.将numpy形式转化为tensor格式
arr = torch.Tensor(arr)
print(arr)
8.增加一个fake batch dimension
arr = arr.unsqueeze(0)
print(arr.size())
9.接下来先展示普通卷积
conv1 = nn.Conv2d(1, 1, 3, stride=1, bias=False, dilation=1)
nn.init.constant_(conv1.weight, 1)
out1 = conv1(arr)
out1
10.最后是空洞卷积
conv2 = nn.Conv2d(1, 1, 3, stride=1, bias=False, dilation=2)
nn.init.constant_(conv2.weight, 1)
out2 = conv2(arr)
out2
这就是空洞卷积和普通卷积的区别,现在补充一下刚刚的函数知识。
补充
np.shape
这个函数它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度。它的输入参数可以使一个整数表示维度,也可以是一个矩阵。
np.expand_dims(a,axis)
其中a指的是numpy矩阵,axis为需要添加纬度的轴
举个例子:
二维数组中
shape中2处于axis=0的位置,3处于axis=1的位置,若在axis=1的位置添加变量,则需在shape中axis=1的位置写1,同时3后移,shape变为(2,1,3)。调用索引时axis=1的位置一直为0