pytorch初学笔记(八):神经网络之卷积操作

 目录

一、卷积操作

 二、二维卷积操作

2.1 torch.nn.functional

 2.2 conv2d方法介绍

2.2.1 使用该方法需要引入的参数

2.2.2 常用参数

2.2.3 关于对input和weight的shape详解

 三、代码实战

3.1 练习要求 

3.2 tensor的reshape操作 

3.3 不同stride的对比  

3.4 不同padding的对比

3.5 完整代码


一、卷积操作

torch.nn — PyTorch 1.13 documentation

 

 二、二维卷积操作

2.1 torch.nn.functional

 代码中引入torch.nn.functional,起别名为F

import torch.nn.functional as F

 2.2 conv2d方法介绍

什么是二维卷积?

二维卷积nn.Conv2d用于图像数据,对宽度和高度都进行卷积 

2.2.1 使用该方法需要引入的参数

torch.nn.functional.conv2d(inputweightbias=Nonestride=1padding=0

dilation=1groups=1) → Tensor

 

2.2.2 常用参数

  • input:输入矩阵,为tensor型,
  • weight:卷积核 ,为tensor型
  • stride:步长,默认为1
  • padding:填充大小,默认为0


2.2.3 关于对input和weight的shape详解

方法中对input和weight要求的shape都需要是4维的。

1.  input的shape要求:      

  • minibatch:batch中的样例个数
  • in_channels:每个样例数据的通道数
  • iH:每个样例的高(行数)
  • iW:每个样例的宽(列数)

2.  weight的shape要求:

  • out_channels:卷积核的个数
  • in_channels/groups:每个卷积核的通道数
  • kH:每个卷积核的高(行数)
  • kW:每个卷积核的宽(列数)

(29条消息) 如何理解卷积神经网络中的通道(channel)_Medlen的博客-CSDN博客_卷积神经网络通道数

正常定义的tensor型shape均为二维,即只有长和宽,

因此需要使用reshape方法进行尺寸重定义。

 三、代码实战

3.1 练习要求 

代码将完成以下操作:

  1. 输入如下图所示的5*5矩阵
  2. 卷积核为下图所示的3*3矩阵
  3. 设置步长stride为1,使用conv2d方法进行卷积操作
  4. 输出结果 

3.2 tensor的reshape操作 

 输入的input大小为5*5,输入的kernel大小为3*3,均不符合conv2d方法中要求的shape大小,因此使用reshape方法进行tensor的尺寸重定义操作。

torch.reshape方法输入的第一个参数为需要改变大小的tensor,第二个参数为需要改变的大小,使用括号括起来的4个数字,前两个数字均为1,后两个数字为tensor的长和宽。

import torch
import torch.nn.functional as F
# 输入
input = torch.tensor([[1,2,0,3,1],
                      [0,1,2,3,1],
                      [1,2,1,0,0],
                      [5,2,3,1,1],
                      [2,1,0,1,1]])

# 卷积核
kernel = torch.tensor([[1,2,1],
                       [0,1,0],
                       [2,1,0]])

print(input.shape)
print(kernel.shape)

# 重新定义尺寸,把尺寸改成四个数,1个batchsize,1个通道,长和宽和之前一样
input = torch.reshape(input,(1,1,5,5))
kernel = torch.reshape(kernel,(1,1,3,3))

print(input.shape)
print(kernel.shape)

输出: 

 可见两个tensor的大小都已经成功被改变,可以输入conv2d中进行下一步操作。 

output = F.conv2d(input,kernel)
print(output)

输出: 

 可见已成功进行卷积操作。

3.3 不同stride的对比  

 步长(stride):

卷积核是在图片上移动后遍历每一个像素,每次移动的大小就是步长stride

#stride=1或2时的输出
output1 = F.conv2d(input,kernel,stride=1)
print(output1)
output2 = F.conv2d(input,kernel,stride=2)
print(output2)

输出:

 

可以看到stride=1时输出的tensor大小为3*3,stride=2时为2*2。

3.4 不同padding的对比

padding(填充):

 习惯上,我们可以使用0来对图像进行填充。规定p( padding )代表填充的层数。

是为了满足输出的图像的维度要求,最终图像的输出宽度会=原来输出宽度+2padding,因为是周围填充

# padding=1或2时的
output3 = F.conv2d(input,kernel,stride=1,padding=1)
print(output3)
output4 = F.conv2d(input,kernel,stride=1,padding=2)
print(output4)

输出:

可以看到不同的padding输出的tensor大小不同。 

3.5 完整代码

import torch
#引入F
import torch.nn.functional as F

# 输入
input = torch.tensor([[1,2,0,3,1],
                      [0,1,2,3,1],
                      [1,2,1,0,0],
                      [5,2,3,1,1],
                      [2,1,0,1,1]])

# 卷积核
kernel = torch.tensor([[1,2,1],
                       [0,1,0],
                       [2,1,0]])

print(input.shape)
print(kernel.shape)

# 重新定义尺寸,把尺寸改成四个数,1个batchsize,1个通道,长和宽和之前一样
input = torch.reshape(input,(1,1,5,5))
kernel = torch.reshape(kernel,(1,1,3,3))

print(input.shape)
print(kernel.shape)

#stride=1或2时的输出
output1 = F.conv2d(input,kernel,stride=1)
print(output1)
output2 = F.conv2d(input,kernel,stride=2)
print(output2)

# padding=1或2时的
output3 = F.conv2d(input,kernel,stride=1,padding=1)
print(output3)
output4 = F.conv2d(input,kernel,stride=1,padding=2)
print(output4)

猜你喜欢

转载自blog.csdn.net/weixin_45662399/article/details/127949867
今日推荐