本文简单谈谈pytorch的二维卷积nn.conv2D,其主要作用为在由多个输入平面组成的输入信号上应用二维卷积。
目录
文章目录
前言
一、卷积过程
1.最简单的二维互相关
2.以RGB为例的多通道卷积
二、conv2D的相关参数
1.conv2D的形式:
2.参数解析
三、示例代码
本文简单谈谈pytorch的二维卷积nn.conv2D,其主要作用为在由多个输入平面组成的输入信号上应用二维卷积。
如图,如果我们的输入是1*5*5(1指通道数,可理解为一层;5*5为尺寸),使其与3*3的卷积核卷积,其过程为从Input中选取一个与卷积核同尺寸的矩阵,使其数乘(注意不是矩阵乘法)再求和,即得到左上角的输出,然后依次类推,获得输出。
RGB图像里面,我们可以分为红,绿,蓝三个通道,每一个通道拥有其特定的卷积核,然后与其特有的卷积核相卷积,然后将三个通道求和得到最后的结果,如果输入有n个通道,则需要n个卷积核
总体上讲,我们将一个n*5*5的输入经过n*3*3的卷积核卷积成了1*3*3的输出,输出通道数为1;如果我们需要通道数为m的输出,那么就需要拿m个(n*3*3)的卷积核卷积,然后我们可以将输出的所有通道拼接起来,得到输出。
注:1.卷积核的通道数与输入的通道数相同(in_channals)
2.输出的通道数是卷积核的数量(out_channals)
nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0,dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
in_channals:输入通道数
out_channals:输出通道数
kernel_size:卷积核尺寸
stride:步长,在上面的例子里,是选取输入内3*3的矩阵与卷积核做数乘,然后向右或向下移动一位再进行卷积,默认stride为一,若为2,则移动两格
padding: 在初始输入外面加0,padding为几则加几圈0,从而改变输出的尺寸,默认为0
dilation:控制卷积核之间的距离
groups:输入和输出之间的连接
bias: 是否将学习到的bias增加到输出中,即是否保存学习
import torch
import torch.nn as nn
import numpy as np
input = np.random.randint(1,10,(5,5)) #生成随机输入
random_kernel = np.random.randint(1,10,(3,3)) #生成随机卷积核
input = torch.Tensor(input).view(1,1,5,5) #设置输入张量
conv_layer = nn.Conv2d(1,1,kernel_size = 3,bias = False) #卷积
kernel = torch.Tensor(random_kernel).view(1,1,3,3) #构造卷积核
conv_layer.weight.data = kernel.data
output = conv_layer(input)
print(input)
print(random_kernel)
print(output)