Pytorch深度学习-----神经网络之卷积层用法详解

系列文章目录

PyTorch深度学习——Anaconda和PyTorch安装
Pytorch深度学习-----数据模块Dataset类
Pytorch深度学习------TensorBoard的使用
Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Compose,RandomCrop)
Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10)
Pytorch深度学习-----DataLoader的用法
Pytorch深度学习-----神经网络的基本骨架-nn.Module的使用
Pytorch深度学习-----神经网络的卷积操作


文章目录

  • 系列文章目录
  • 一、卷积层是什么?
  • 二、torch.nn.Conv2d参数介绍
  • 三、卷积层操作实践
    • 1.自定义卷积,查看创建的卷积参数
    • 2.对比卷积前后的图片shape
    • 3.Tensorboard可视化显示效果


一、卷积层是什么?

卷积层是CNN(Convolutional Neural Networks)中的基本网络层,主要用于对图像进行特征提取操作。关于卷积操作实例也可参考上一篇文章-卷积操作。

官网对卷积的描述如下:
在这里插入图片描述
其中Conv1d就表示一维卷积,2d为后缀就表示二维卷积,下面主要以二维卷积Conv2d为例。

二、torch.nn.Conv2d参数介绍

附上官网对参数的解释:

Parameters:
in_channels (int) – Number of channels in the input image

out_channels (int) – Number of channels produced by the convolution

kernel_size (int or tuple) – Size of the convolving kernel

stride (int or tuple, optional) – Stride of the convolution. Default: 1

padding (int, tuple or str, optional) – Padding added to all four sides of the input. Default: 0

padding_mode (str, optional)'zeros', 'reflect', 'replicate' or 'circular'. Default: 'zeros'

dilation (int or tuple, optional) – Spacing between kernel elements. Default: 1

groups (int, optional) – Number of blocked connections from input channels to output channels. Default: 1

bias (bool, optional) – If True, adds a learnable bias to the output. Default: True

从上述可知,总共有9个参数,具体解释如下:
in_channels:表示输入的图片通道数目。
out_channels:表示输出的图片通道数目。
kernel_size:表示卷积核的大小,当卷积是正方形的时候,只需要一个整数边长即可,卷积不是正方形,要输入一个元组表示高和宽。
stride:表示每次卷积核移动的步长值。
padding:表示是否添加边界,一旦设置就是四周都添加。在原始的行列基础上,行增加2行,列增加2列。
dilation:表示控制卷积核之间的间距。
groups:表示控制输入和输出之间的连接。
bias:表示是否将一个 bias 增加到输出。
padding_mode:表示接收’zeros’, ‘reflect’, ‘replicate’ or ‘circular’. Default: ‘zeros’,默认是’zeros’,即默认在padding操作时,在外一圈是填充的0。
注意:常用的参数为:in_channels ,out_channels ,kernel_size ,stride ,padding,且kernel_size,stride,padding,dilation这几个可以使一个整数或一个元组,如果是元组的形式就是代表高度和宽度,如果是一个值就是代表高度和宽度是相等的。

三、卷积层操作实践

下面代码以CIFAR10数据集为例进行实践

1.自定义卷积,查看创建的卷积参数

import torch
import torchvision
from torch.utils.data import DataLoader

# 准备数据集
dataset = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集,每次从数据集中取64
dataloader = DataLoader(dataset,batch_size=64)
# 创建自己的神经网络类
class LGL(torch.nn.Module):
    def __init__(self):
        super().__init__()
        # 即输入通道设定为RGB3层,输出通道设定为6,卷积核大小为3,步长设定1,不进行填充
        self.conv2 = torch.nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        return self.conv2(x)
print(LGL())  # 打印创建的卷积参数

在这里插入图片描述
从输出结果可知,输入通道为3,输出通道为6,卷积核结构为3×3,步长为1。

2.对比卷积前后的图片shape

import torch
import torchvision
from torch.utils.data import DataLoader

# 准备数据集
dataset = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集,每次从数据集中取64
dataloader = DataLoader(dataset,batch_size=64)
# 创建自己的神经网络类
class LGL(torch.nn.Module):
    def __init__(self):
        super(LGL,self).__init__()
        # 即输入通道设定为RGB3层,输出通道设定为6,卷积核大小为3,步长设定1,不进行填充
        self.conv2 = torch.nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        return self.conv2(x)
# print(LGL())  # 打印创建的卷积参数
# 输出卷积前后的图片大小
for data in dataloader:
    img, target = data
    # 卷积前
    print(img.shape)
    # 卷积后
    outputs = LGL().conv2(img)
    print(outputs.shape)

在这里插入图片描述
torch.Size([64, 3, 32, 32]) 表示一次性读64张图片,原始图像为3通道,大小为3232
torch.Size([64, 6, 30, 30]) 表示一次性读64张图片,原始图像为6通道,大小为30
30
为什么大小会变成30*30?
有官网关于h和w的计算公式如下图所示:
在这里插入图片描述
得:
输入图像是32×32,即h=30,w=30,
卷积尺寸是3×3,即kernel_size=3
没有填充,即padding=0
控制卷积核之间的间距也没有,即dilation=0
步长为1,即stride=1
于是输出图像的尺寸为:32-3+1=30,也就是30×30

3.Tensorboard可视化显示效果

代码如下:

import torch
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 准备数据集
dataset = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集,每次从数据集中取64
dataloader = DataLoader(dataset,batch_size=64)
# 创建自己的神经网络类
class LGL(torch.nn.Module):
    def __init__(self):
        super(LGL,self).__init__()
        # 即输入通道设定为RGB3层,输出通道设定为6,卷积核大小为3,步长设定1,不进行填充
        self.conv2 = torch.nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        return self.conv2(x)
# print(LGL())  # 打印创建的卷积参数
# 输出卷积前后的图片大小
writer = SummaryWriter("logs")
step=0
for data in dataloader:
    img, target = data
    # 卷积前
    print(img.shape)
    writer.add_images("input",img,step)
    # 卷积后
    outputs = LGL().conv2(img)
    writer.add_images("output",outputs,step)
    step = step+1
    print(outputs.shape)
writer.close()

结果报错:
在这里插入图片描述
原因如下:
因为由前面可以知道,经过卷积后图片的通道变为了6,此时在Tensorboard可视化中无法显示通道为6的图片,所以需要进行reshape进行重新设定。
outputs = torch.reshape(outputs,(-1,3,30,30)) 将批次设定为-1,此时程序会自动匹配批次大小。
修改后代码如下:

import torch
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 准备数据集
dataset = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集,每次从数据集中取64
dataloader = DataLoader(dataset,batch_size=64)
# 创建自己的神经网络类
class LGL(torch.nn.Module):
    def __init__(self):
        super(LGL,self).__init__()
        # 即输入通道设定为RGB3层,输出通道设定为6,卷积核大小为3,步长设定1,不进行填充
        self.conv2 = torch.nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        return self.conv2(x)
# print(LGL())  # 打印创建的卷积参数
# 输出卷积前后的图片大小
writer = SummaryWriter("logs")
step=0
for data in dataloader:
    img, target = data
    # 卷积前
    print(img.shape)
    writer.add_images("input",img,step)
    # 卷积后
    outputs = LGL().conv2(img)
    outputs=outputs.reshape(-1,3,30,30)
    writer.add_images("output",outputs,step)
    step = step+1
    print(outputs.shape)
writer.close()

Tensorboard可视化显示效果如下:
在这里插入图片描述

声明:本篇文章未经许可,谢绝转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/54206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Github】自动监测 SSL 证书过期的轻量级监控方案 - Domain Admin

在现代的企业网络中,网站安全和可靠性是至关重要的。一个不注意的SSL证书过期可能导致网站出现问题,给公司业务带来严重的影响。针对这个问题,手动检测每个域名和机器的证书状态需要花费大量的时间和精力。为了解决这个问题,我想向…

ava版知识付费平台免费搭建 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

提供私有化部署,免费售后,专业技术指导,支持PC、APP、H5、小程序多终端同步,支持二次开发定制,源码交付。 Java版知识付费-轻松拥有知识付费平台 多种直播形式,全面满足直播场景需求 公开课、小班课、独…

运行vue项目显示找不到vue-cli

直接下载ruoyi源码到本地,启动ruoyi-ui的时候报错: 原来是电脑没配置nodejs。 所以先去官网下载nodejs,然后安装完之后,在命令行窗口输入: 显示安装成功。 但还没有结束,还要配置npm的全局模块的存放路径…

Debian/Ubuntu 安装 Chrome 和 Chrome Driver 并使用 selenium 自动化测试

截至目前,Chrome 仍是最好用的浏览器,没有之一。Chrome 不仅是日常使用的利器,通过 Chrome Driver 驱动和 selenium 等工具包,在执行自动任务中也是一绝。相信大家对 selenium 在 Windows 的配置使用已经有所了解了,下…

哔哩哔哩缓存转码|FFmpeg将m4s文件转为mp4|PHP自动批量转码B站视频

window下载安装FFmpeg 打开ffMpeg官网选择window>Windows builds from gyan.dev 打开https://www.gyan.dev/ffmpeg/builds/ 这里是上面提取的下载链接如果过期不能用自己去官网下 配置FFmpeg环境变量 上面下载的FFmpeg是绿色软件,下载解压到你的常用软件安装目…

《水经注地图服务》发布的影像数据如何在OsgEarth中调用

OsgEarth 是一个用于OpenSceneGraph (OSG)的可扩展地形渲染工具包,它是一个开源、高性能、3D 图形工具包。 只需创建一个简单的 XML 文件,将其指向您的图像、高程和矢量数据,将其加载到您最喜欢的 OSG 应用程序中,然后开始&#…

有赞商城无需代码连接美团开店宝的方法

1 使用场景 大部分的商家都会美团开店宝来作为线上店铺运营的营销服务平台,当有用户下单时,商家都希望第一时间知晓用户信息,但经常缺少数据依据,无法构建精确的客户画像,导致很多线索白白流失,难以做出有效…

在windows下安装ruby使用gem

在windows下安装ruby使用gem 1.下载安装ruby环境2.使用gem3.gem换源 1.下载安装ruby环境 ruby下载地址 选择合适的版本进行下载和安装: 在安装的时候,请勾选Add Ruby executables to your PATH这个选项,添加环境变量: 安装Ruby成…

在windows上安装minio

1、下载windows版的minio: https://dl.min.io/server/minio/release/windows-amd64/minio.exe 2、在指定位置创建一个名为minio文件夹,然后再把下载好的文件丢进去: 3、右键打开命令行窗口,然后执行如下命令:(在minio.…

使用vs 2017 C#项目发布

C#项目发布 vs 2017 打包项目源代码 (发布)iis 配置添加ssl 配置 vs 2017 打包项目源代码 (发布) iis 配置 添加ssl 配置 https://help.aliyun.com/zh/ssl-certificate/user-guide/install-ssl-certificates-on-iis-servers

不同语言操作符的优先级

看到标题,可能会心生疑惑: 这么基础且重要的操作,不同语言不应该是一致的吗? 并不一定,比如对于右移运算和加法运算,Go就与其他多数语言表现得不一致: Go: package mainimport "fmt"func main() …

el-select 中加了filterable 点击箭头下拉框回收不去问题

解决方式①:参考连接:(亲测有用)【element-select】添加过滤属性以及change后下拉框异常_element select过滤时,不收起下拉框_Y.哈哈的博客-CSDN博客 1、添加过滤属性后点击下箭头不收起下拉框 2、change通过dialog触发事件后&…

超详细 | 模拟退火算法及其MATLAB实现

模拟退火算法(simulated annealing,SA)是20世纪80年代初期发展起来的一种求解大规模组合优化问题的随机性方法。它以优化问题的求解与物理系统退火过程的相似性为基础,利用Metropolis算法并适当地控制温度的下降过程实现模拟退火,从而达到求解…

【Liux下6818开发板(ARM)】触摸屏

(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…

系统保留分区被误删怎么办?

当您在全新的磁盘上安装Windows时,将在磁盘的开头创建一个名系统保留的分区,大小约为100MB,然后是系统驱动器,然后是其他的驱动器。通常,系统保留分区在Windows 8中为350MB,在Windows 10中为500MB。系统保留…

解决git仓库无效问题

解决fatal: … not valid: is this a git repository?问题 凭证编辑修改成自己的账号密码即可解决

批量复制并重命名文件夹:实现指定目录下文件夹的自动覆盖更新

你是否曾经有过这样的经历,需要对某个文件夹进行更新,却发现它的名字和其他文件夹重复,导致更新后文件混乱?有了批量复制并重命名文件夹的功能,这一切都将成为过去。今天,我们将向您介绍如何使用这项功能&a…

【 Python 全栈开发 - 人工智能篇 - 45 】决策树与随机森林

文章目录 一、概念与原理1.1 决策树1.1.1 概念1.1.2 原理特征选择分割方法 1.1.3 优点与缺点1.1.4 Python常用决策树算法 1.2 随机森林1.2.1 概念1.2.2 原理1.2.3 优点与缺点1.2.4 Python常用随机森林算法 1.3 决策树与随机森林的比较1.3.1 相同之处1.3.2 不同之处 二、决策树算…

UNIX网络编程卷一 学习笔记 第二十六章 线程

在传统UNIX模式中,当一个进程需要另一个实体完成某事时,它就fork一个子进程,并让子进程去执行处理,Unix上大多网络服务器程序就是这么写的。 这种范式多年来一直用得很好,但fork调用存在一些问题: 1.fork调…

分享一次使用iostat命令定位邮件系统性能故障的经历

目录 一、背景介绍 二、环境介绍 三、分析过程 四、解决方法 最近在整理iostat,回忆起以前处理的系统性能的问题,现把分析方法整理如下。 一、背景介绍 以前公司内网部署有一套邮件系统,每天下午16:00-16:30之间邮件收发非常卡。 二、环…
最新文章