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

server/2024/9/24 12:59:30/

代码解释帮助理解:

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的数目。

http://www.ppmy.cn/server/39765.html

相关文章

面试前端随笔20240510

最近公司招聘前端开发人员有幸参与帮听,总结了三个有关vue的面试问题和答案,现在分享一下。 1.Vue2数据监听无法监听数组为啥?有啥解决方案?vue3中是如何处理这个问题? vue2的官方说明了defineProperty的一些限制&…

【Linux】环境变量、进程替换、wait/waitpid

文章目录 一、环境变量1. 查看环境变量的方法1.1 env1.2 echo $环境变量名 2. 在代码中使用环境变量的方法2.1 命令行参数传参2.2 environ变量2.3 getenv( )函数 3. export 二、进程替换1. execl2. execlp3. execle4. execv5. execvp6. execvpe7. 补充7.1 命名理解7.2 返回值 三…

图像下载的新趋势:Kotlin技术探索与实践

随着互联网的迅速发展和智能设备的普及,图像下载作为一项重要的技术应用,也在不断演进和创新。在这篇文章中,我们将探讨图像下载的新趋势,并使用Kotlin语言进行实践探索。 引言 图像下载是指从网络上获取图像并保存到本地设备的…

Thread类的属性及常见方法

Thread是JVM用于管理线程的类,换句话说,每个线程都有一个Thread对象与之关联,一个Thread对象有ID、名称、优先级、状态等属性,JVM会将这些Thread对象组织起来,用于线程调度,线程管理。 1. Thread的常见构造…

RK3588 usb adb调试

问题:2路usb3.0 otg,在使用其中一路typeC1作用adb功能使用后,将这路设置成host模式后,另外一路typeC0设置device,这路还是无法当做usb adb来使用。 查看usb typeC1当前模式 cat /sys/kernel/debug/usb/fc400000.usb/m…

防爆气象仪

TH-WFB5矿山作为一个特殊的工作环境,其安全生产一直是重中之重。而矿山环境中的气象变化,如温度、湿度、风速、风向等,不仅直接影响矿山的日常生产活动,还关系到矿工的生命安全。因此,防爆气象仪的应用显得尤为重要。 …

【Pytorch】3.Transforms的运用

什么是Transforms 在PyTorch中,transforms是用于对数据进行预处理、增强和变换的操作集合。transforms通常用于数据载入和训练过程中,可以包括数据的归一化、裁剪、翻转、旋转、缩放等操作,以及将数据转换成PyTorch可以处理的Tensor格式。 Tr…

JVM进程缓存 Caffeine

JVM进程缓存 Caffeine 初识Caffeine Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。 ben-manes/caffeine: A high performance caching library for Java (github.com) 实例代码 Test void testBasicOps() {// 创建缓存对象Cache&…