神经网络卷积层和最大池化

news2024/11/13 8:41:59

文章目录

    • 一、卷积层原理
    • 二、相关函数的概念
    • 三、卷积层的应用
    • 四、最大池化原理
    • 五、最大池化案例

一、卷积层原理

./ 当前目录;…/ 上级目录
父类(也称为基类或超类)是指在类继承体系中被其他类继承的类。也就是被其他子类进行调用的类
当In_channel=1时,输出的out_channel=1
在这里插入图片描述
当out_channel=2时,然后有连个卷积核,将他们进行卷积输出得到两个输出结果
在这里插入图片描述
输出的两个图层就会叠加起来
在这里插入图片描述

二、相关函数的概念

向前传播forward函数

前向传播(Forward Propagation)是指在神经网络中,输入数据经过每一层的计算,最终产生输出的过程。在PyTorch中,forward函数是nn.Module类的一个必需方法。当你创建一个自定义的层或模型时,你需要重写这个方法来定义前向传播的行为。

in_channels和out_channels这两个术语通常用于描述卷积层(Convolutional Layer)的输入和输出特征通道数。
in_channels:指的是卷积层输入数据的通道数。在图像处理中,例如,一个RGB图像有3个通道(红色、绿色、蓝色),因此in_channels将是3。对于灰度图像,in_channels将是1。
out_channels:指的是卷积层输出数据的通道数。这通常对应于卷积层中卷积核(或滤波器)的数量。在卷积神经网络中,通过改变out_channels的数量,可以控制网络的容量和复杂性。例如,如果你想要让卷积层输出更多的特征图,你可以增加out_channels的数量。
kernel_size:一般是指卷积核的大小
stride指的是卷积路径的大小

三、卷积层的应用

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

# 加载CIFAR-10数据集,设置为不下载训练集,只下载测试集,并且将图片转换为Tensor格式
dataset = torchvision.datasets.CIFAR10("../data", train=False, transform=torchvision.transforms.ToTensor(),download=True)
# 创建一个DataLoader,用于批量加载数据,这里设置批量大小为64
dataloader = DataLoader(dataset, batch_size = 64)

class Sen(nn.Module):
    def __init__(self):
        super(Sen, self).__init__()
        # 定义一个卷积层,输入通道数为3(RGB图像),输出通道数为3,卷积核大小为3x3,步长为1,无填充
        self.conv1 = Conv2d(in_channels=3,out_channels=3,kernel_size=3,stride=1,padding=0)

    def forward(self, x):
        x = self.conv1(x)
        return x

sen = Sen()

writer = SummaryWriter("./logs")
step = 0
for data in dataloader:
    imgs, targets = data
    output = sen(imgs)
    writer.add_images("input", imgs, step)

    writer.add_images("output", output, step)

    step = step + 1

运行结果:
在这里插入图片描述
卷积后出现颜色不一样是因为卷积核的生成是随机的,所以会出现不同颜色的情况,因为我们没有定义卷积核。

四、最大池化原理

最大池化的运用场合有很多,像例如将1080p的视频压缩成720p,还有马赛克也是最大池化作用出来的。

在最大池化中,池化核数也就是步长,像下面的是池化核是3,那么他的步长也是3
在这里插入图片描述
池化核框框经过3个步长进行取框框内的最大值,但如下图所示,因为池化核的框框超出了输入图像,所以就根据Ceiling_model为True还是False来进行判断。
Ceiling and Floor 的判断准则:
在这里插入图片描述
当取Floor时,2.31往下取整,当为Ceiling时,2.31往上取整

当Ceiling_model = True时,镂空也可以去取其中的最大值
当Ceiling_model = False时,镂空则取值为0
在这里插入图片描述

五、最大池化案例

最大池化的input通常应用于多维数据,如图像数据。在卷积神经网络(CNN)中,输入通常是三维的(高度、宽度、通道数)

代码用dtype=torch.float32这句话的原因。
默认情况下,torch.tensor 可能会将输入数据解释为整数(torch.int64),尤其是当你没有指定 dtype 时,上面的代码会创建一个整数 Tensor。如果你的神经网络层(如卷积层或池化层)要求输入是浮点数(例如,torch.float32),那么你必须将输入 Tensor 转换为浮点数类型。否则,计算可能会出错或产生不正确的结果。
通过使用 dtype=torch.float32,你可以确保 Tensor 具有正确的数据类型,从而避免潜在的数据类型不匹配和计算错误。

import torch
from torch import nn
from torch.nn import MaxPool2d

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]], dtype=torch.float32)

#因为输入的input必须是四维的,所以需要用reshape进行格式的变换
input = torch.reshape(input,(-1, 1, 5, 5))
print(input.shape)

class Sen(nn.Module):
    def __init__(self):
        super(Sen,self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)

    def forward(self,input):
        output = self.maxpool1(input)
        return output

sen = Sen()
output = sen(input)
print(output)

运行结果:
在这里插入图片描述
与我们自己计算的结果相比:
在这里插入图片描述
可以看出当Ceiling_model = True时,运算结果就是【2, 3,5, 1】

用图片运行来显示一下最大池化:

import torch
import torchvision.datasets
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
import dataloader

dataset = torchvision.datasets.CIFAR10("../data", train=False, download=True,
                                       transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset, batch_size=64)
class Sen(nn.Module):
    def __init__(self):
        super(Sen, self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)

    def forward(self,input):
        output = self.maxpool1(input)
        return output

sen = Sen()

writer = SummaryWriter("logs_maxpool")
step = 0

for data in dataloader:
    imgs, targets = data
    writer.add_images("input", imgs, step)
    output = sen(imgs)
    writer.add_images("output",output, step)
    step = step + 1

writer.close()

运行结果:
在这里插入图片描述
从上图中可以看到,图片进行了压缩,也就是画质降低,是不是很像马赛克

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「豆包 Marscode 体验官」AI 加持的云端 IDE——三种方法高效开发前后端聊天交互功能

以下是「豆包 MarsCode 体验官」优秀文章,作者努力的小雨。 豆包 MarsCode 豆包MarsCode 编程助手支持的 IDE: 支持 Visual Studio Code 1.67.0 及以上版本,以及 JetBrains 系列 IDE,如 IntelliJ IDEA、Pycharm 等,版本要求为 22…

016.PL-SQL编程—过程

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

服务器测试之GPU基础汇总

GPU基础汇总 1.GPU简介 1.1.什么是GPU GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。一个专门的图形核心处理器。GPU是显示卡的“大脑”,决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。可以形…

Flask 第三课 -- 第一个应用

上一章节我们已经成功安装了 Flask,接下来我们可以创建一个简单的 Flask 应用。 首先,创建一个名为 app.py 的文件,并添加以下内容: from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello,…

网络拓扑结构介绍

这张图展示了一个复杂的网络拓扑结构,它包括了多个运营商的接入、负载均衡、安全防护以及数据处理等多个关键环节。整个网络通过精心设计的架构和高效的节点连接,实现了数据的快速传输和安全处理。 一、各个模块介绍 运营商接入: 移动、电信…

论文速读|形机器人的高速和抗冲击远程操作

论文地址:https://arxiv.org/pdf/2409.04639 本文提出了一种综合解决方案,用于远程控制类人机器人,实现了高速度和冲击抵抗的操作。通过结合无校准的运动捕捉和重定标、低延迟全身运动流式传输工具箱和高带宽的摆线驱动器,显著提高…

【Python报错已解决】ValueError: All arrays must be of the same length

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:调整数组长度2.2 步骤二…

数据流图的例题2

答案选B 解析: 第一个错误,E1和E2是外部实体,实体之间不可能有数据传输,DF2错误 第二个错误,DF6是外部实体把数据传到存储。外部实体必须把数据传到加工,进行加工之后才能对数据存储,DF6错误…

Git环境搭建

我的博客大纲 我的GIT学习大纲 Git安装步骤: 1.官网地址 查看 GNU 协议,可以直接点击下一步: 2.Git配置选项如下: 3.选择后台客户端连接协议,选默认值 OpenSSL,然后下一步。 4.Git换行符号 5.选择终端类型…

Lesson08---string类(2)

1.assign assign的功能就类似于把string里面原来有的东西清空然后重新赋值 但是重新赋值也可以达到一样的效果感觉没什么用,了解一下就行 2.insert 第一个参数是在第几个位置插入,第二个参数是插入的字符串 但是这里不得不吐槽一下这里只能是字符串&…

Python之异常处理与程序调试(Exception Handling and Program Debugging in Python)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Netty权威指南:Netty总结-服务端创建

第13章 服务端创建 13.1 原生NIO类库复杂性 开发高质量的NIO的程序并不简单,成本太高 13.2 服务端创建源码 通过ServerBootStrap启动辅助类启动Netty 13.2.1 创建时序图 以下是关键步骤: 创建ServerBootStrap实例。这是启动辅助类,提供一…

AI写作培训课创业参考模式:《如何与AI共同写作》

在数字化时代,写作能力已成为职场和生活中不可或缺的一项技能。随着人工智能技术的发展,AI工具开始在写作过程中发挥越来越重要的作用。《如何与AI共同写作》正是这样一门专业的在线写作课程,它通过结合AI技术和实践操作,帮助学员在30天内掌握高效的写作技巧,提升个人品牌…

网络安全-原型链污染

目录 一、简单介绍一下原型链 二、举个例子 三、那原型链污染是什么呢 四、我们来看一道题-hackit 2018 4.1 环境 4.2开始解题 4.3 解答: 一、简单介绍一下原型链 JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原…

MySQL基础——DQL

DQL(Data Query Language,数据查询语言)是SQL中的一个子集,主要用于查询数据库中的数据。DQL的核心语句是 SELECT,它用于从一个或多个表中提取数据,并能够通过各种条件进行过滤、排序和聚合操作。下面是DQL…

Android解析XML格式数据

文章目录 Android解析XML格式数据搭建Web服务器Pull解析方式SAX解析方式 Android解析XML格式数据 通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器上获取数据。不过这个时候就出现了…

Vant 按需引入导致 Typescript,eslint 报错问题

目录 1,按需引入问题2,Typescript 报错解决3,eslint 报错解决 1,按需引入问题 vant4 通过按需引入的配置 使用组件时,会同时将样式自动导入。 所以可直接使用相关的 API 方法,样式也没有问题。比如&#…

如何使用VeilTransfer评估和提升组织的数据安全态势

关于VeilTransfer VeilTransfer是一款功能强大的企业数据安全检测与增强工具,该工具基于Go语言开发,旨在帮助广大研究人员完成企业环境下的数据安全测试并增强检测能力。 此工具模拟了高级威胁行为者使用的真实数据泄露技术,使组织能够评估和…

基于SpringBoot的求职招聘管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的求职招聘管理系统…

1.10 DFT示例2

1.10 DFT示例2 1.10.2 一个通用正弦波 通过将复正弦波的表达式代入DFT的定义,并按照矩形序列示例中的相同步骤,可以类似地推导出通用正弦波的DFT。 尽管如此,在理解了上述概念后,我们可以通过一种更简单的方法看到一般正弦波的…