深入理解卷积函数torch.nn.Conv2d的各个参数以及计算公式(看完写模型就很简单了)

代码解释帮助理解:

torch.randn(10, 3, 32, 32),初始数据:(10, 3, 32, 32)代表有10张图片,每张图片的像素点用三个数表示,每张图片大小为32x32。(重点理解这个下面就好理解了)
nn.Conv2d(3, 64, kernel_size=3, padding=1)理解Conv2d参数。表示图片输入的通道是3,输出为64通道(因为用的是64个卷积核(滤波器)。这样就理解卷积的含义了。

而conv3x3_1 = nn.Conv2d(64, 164,)#表明输入通道是64,输出通道是164.这里的输入要等于上一层的输出通道64,相当于有64个矩阵。输出通道数目可以自定义指定。


得出结论(重点):

nn.Conv2d(3, 64,)的前两个参数输入通道数和输出通道数其实在修改的是图片的单个像素用多少个数字表示,如RGB是用三种颜色(用三个数字表示一个像素)。也就是修改的是torch.randn(10, 3, 32, 32)里面的3。

后三个参数卷积核大小(kernel_size)和步长(stride)以及填充(padding)是改变图片的尺寸。也就是修改的是torch.randn(10, 3, 32, 32)里面的32x32。

 

import torch
import torch.nn as nn

# 创建输入张量
input_tensor = torch.randn(10, 3, 32, 32)  # 输入通道数为3,输入特征图尺寸为32x32,相当于有3个32x32的矩阵,也就是一张图片

# 创建3x3卷积层
conv3x3 = nn.Conv2d(3, 64, kernel_size=3, padding=1)#表明输入通道是3,输出通道是64

# 进行3x3卷积操作
output = conv3x3(input_tensor)

# 打印输出特征图的尺寸
print(output.size())
torch.Size([10, 64, 32, 32])

第一种代码:

conv3x3_1 = nn.Conv2d(64, 164, kernel_size=3, padding=1)#表明输入通道是64,输出通道是164.这里的输入要等于上一层的输出通道64,相当于有64个二矩阵

# 进行3x3卷积操作
output1 = conv3x3_1(output)
print(output1.size())

输出结果:torch.Size([10, 164, 32, 32])

上面修改第二层Conv2d()的输出通道数参数,改为164,发现最后输出结果output1也只是输出通道数目(也就是一个像素点用多少数字表示)变化,其他三个参数都没变,分别代表10张图片,图片尺寸为32x32。

**************************************************************************************

那么如何让图片大小32x32变化呢?答案就是改变卷积核大小(kernel_size)和步长(stride)以及填充(padding)。

将第一种代码改为下面代码:

conv3x3_1 = nn.Conv2d(64, 164, kernel_size=5, padding=4,stride=2)#表明输入通道是64,输出通道是164.这里的输入要等于上一层的输出通道64,相当于有64个二矩阵

# 进行3x3卷积操作
output1 = conv3x3_1(output)
print(output1.size())
输出结果:torch.Size([10, 164, 18, 18])

发现图片大小变成18x18了,

计算公式为

Hout公式代入:18 = [32+2x4-1x(5-1)-1]/2+1结果再向下取整 (也就是35/2+1向下取整 = 18)

同理Wout公式带入也是18(明显也能看出参数矩阵都是矩阵,长宽的值一样)

tips1:nn.Conv2d中dilation这个参数 控制卷积核点的间距 不常用,代入上式默认值为1

dilation(int or tuple, optional)Spacing between kernel elements. Default: 1扩张操作:控制kernel点(卷积核点)的间距,默认值:1

tips2:有时候改完这三个参数或者其中的一两个,也可能会不同的参数经过同一个公式,导致图片尺寸不变。

最重要的是要理解nn.Conv2d参数的意思(下面是常用的五个参数):

参数参数类型
in_channelsintNumber of channels in the input image输入图像通道数
out_channelsintNumber of channels produced by the convolution卷积产生的通道数
kernel_size(int or tuple)Size of the convolving kernel卷积核尺寸,可以设为1个int型数或者一个(int, int)型的元组。例如(2,3)是高2宽3卷积核
stride(int or tuple, optional)Stride of the convolution. Default: 1卷积步长,默认为1。可以设为1个int型数或者一个(int, int)型的元组。
padding(int or tuple, optional)Zero-padding added to both sides of the input. Default: 0填充操作,控制padding_mode的数目。
  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱生活的五柒

谢谢你的打赏,人好心善的朋友!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值