PyTorch的卷积和池化

news2024/11/30 14:33:46

16969bd261584bfcbe198e40a98f2b99.gif

659c8d58a66d4d5182544fee21524d4d.png

卷积计算 

324eb12d248140bbbec2c8dbcfce7026.png

  1. input 表示输入的图像
  2. filter 表示卷积核, 也叫做滤波器
  3. input 经过 filter 的得到输出为最右侧的图像,该图叫做特征图

 0f7eb9b0578449789ab666dd7e434070.png

卷积的计算是将卷积核放入左上角,在局部区域间做点积,然后将卷积核在Input上面依次从左向右,从上到下平移。左上角的点积操作:32b4754544024e34810dd427327bcce9.png

得到最终的特征图为:

53af8fff45454bd4a4c6354fc58e20cd.png

f78ebb15eafe471c9e370e4e14f962ca.png

Padding 

通过上面的卷积计算过程,我们发现最终的特征图比原始图像小很多,如果想要保持经过卷积后的图像大小不变, 可以在原图周围添加 padding 来实现

c73b68f955dc49a090018b0a4aa3df8e.png

Stride 

按照步长为1来移动卷积核,得到上面的特征图,如果按照步长为2的话,特征图就变成了2*2的特征图了。 

6f1f18db0ebc4632afae26970df4ffd7.png

多通道卷积计算

实际中的图像都是多个通道组成的,即多个Input图前后贴在一起。

697b2416b6ef4295aa757774c1a36929.png

  1. 当输入有多个通道(Channel), 例如 RGB 三个通道, 此时要求卷积核需要拥有相同的通道数数。
  2. 每个卷积核通道与对应的输入图像的各个通道进行卷积。
  3. 将每个通道的卷积结果按位相加得到最终的特征图。

多卷积核卷积计算 

上面我们只使用一个卷积核进行特征提取,实际对图像进行特征提取时,我们需要使用多个卷积核进行特征提取; 这个多个卷积核可以理解为从不同到的视角、不同的角度对图像特征进行提取。

2cbe55c459024499b9f1d77d320bc9cc.png

特征图大小 

输出特征图的大小与三个参数有关:

  1. size: 卷积核/过滤器大小,一般会选择为奇数,比如有 1*1, 3*3, 5*5*
  2. Padding: 零填充的方式
  3. Stride: 步长

计算方法:

  1. 输入图像大小: W x W
  2. 卷积核大小: F x F
  3. Stride: S
  4. Padding: P
  5. 输出图像大小: N x N

 d429570e755b4d5bb5470ff40ed04ee2.png

  1. 例如,(5 - 3 + 2) / 1 + 1 = 5, 即得到的特征图大小为: 5 x 5

60d3a31c753040038d25392fb2ae91b9.png

PyTorch 对卷积层的使用 

import torch
import torch.nn as nn
import matplotlib.pyplot as plt


# 显示图像
def show(img):

    # 输入形状: (Height, Width, Channel)
    plt.imshow(img)
    plt.axis('off')
    plt.show()


# 单个多通道卷积核
def test01():

    # 读取图像, 形状: (1024, 720, 3)
    img = plt.imread('QQ.png')
    show(img)

    # 构建卷积层
    conv = nn.Conv2d(in_channels=3, out_channels=1, kernel_size=3, stride=1, padding=1)

    # 输入形状: (Channel, Height, Width)
    img = torch.tensor(img).permute(2, 0, 1)

    new_img = conv(img)

    new_img = new_img.permute(1, 2, 0)

    show(new_img.detach().numpy())



if __name__ == '__main__':
    test01()

输出的单卷积特征图:

c76839aae4644219a5aebbdbf544aa73.png

0a760d86999143dab70b20dfe556dfd9.png

多卷积特征图: 

test01 函数使用一个多通道卷积核进行特征提取,test02 函数使用 3 个多通道卷积核进行特征提取: 

def test02():

    # 读取图像, 形状:
    img = plt.imread('QQ.png')

    conv = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3, stride=1, padding=1)

    # 输入形状: (Channel, Height, Width)
    img = torch.tensor(img).permute(2, 0, 1)

    new_img = conv(img)

    new_img = new_img.permute(1, 2, 0)

    # 打印三个特征图
    show(new_img[:, :, 0].detach().numpy())
    show(new_img[:, :, 1].detach().numpy())
    show(new_img[:, :, 2].detach().numpy())

 

这些就是卷积层的使用,下一节我们去了解池化层~ 

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

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

相关文章

STM32串口通信入门

文章目录 一、串口协议和RS-232标准,以及RS232电平与TTL电平的区别1.串口通信协议2.RS-232标准3.RS232电平与TTL电平的区别4.USB/TTL转232“模块(CH340芯片为例) 二、补充实验(一)几个常见的库函数、结构体1.时钟配置函…

LeetCode—用队列实现栈

一.题目 二.思路 1.后入先出的实现: 创建两个队列来实现栈(后入先出): 两个队列,保持一个存数据,另一个为空,入数据(push)要入不为空的队列,(p…

深圳晶彩智能ESP32-1732S019实时观看GPIO的状态

深圳晶彩智能ESP32-1732S019介绍 ESP32-1732S019开发板是基于ESP32-S3-WROOM-1模块作为主控,双核MCU ,集成WI-FI和蓝牙功能,主控频率可达240MHz , 512KB SRAM , 384KB ROM,8M PSRAM,16MB Flash,显示分辨率为170*320 I…

冯喜运:5.12黄金回撤继续上涨,下周原油走势分析

【黄金消息面分析】:本周,黄金市场迎来了自4月中旬以来的最佳单周表现。周五(3月9日),金价攀升至2360.54美元/盎司,涨幅0.62%,而纽约商品交易所6月交割的黄金期货价格上涨1.5%,收报2…

Springboot+Vue项目-基于Java+MySQL的毕业就业信息管理系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

其他的 框架安全:Apache Shiro 漏洞序列.(CVE-2016-2807)

什么是 Apache Shiro Apache Shiro 是一个强大且易用的Java安全框架,它为应用程序提供了身份验证、授权、加密和会话管理等常见的安全功能。漏洞大多会发生在登录处,返回包里包含remeberMedeleteMe字段.( Shiro 这个属于第三方的&#xff0c…

表的创建与操作表

1. 创建表 创建表有两种方式 : 一种是白手起家自己添,一种是富二代直接继承. 2. 创建方式1 (1). 必须具备条件 CREATE TABLE权限存储空间 (2). 语法格式 CREATE TABLE IF NOT EXISTS 表名(字段1, 数据类型 [约束条件] [默认值],字段2, 数据类型 [约束条件] [默…

Spring高手之路18——从XML配置角度理解Spring AOP

文章目录 1. Spring AOP与动态代理1.1 Spring AOP和动态代理的关系1.2 AOP基本术语 2. 通过XML配置实现Spring AOP2.1 添加Spring依赖2.2 定义业务接口和实现类2.3 定义切面类2.4 配置XML 1. Spring AOP与动态代理 1.1 Spring AOP和动态代理的关系 Spring AOP使用动态代理作为…

用 Python 和 AkShare 进行个股数据清洗:简易多功能方法

标题:用 Python 和 AkShare 进行个股数据清洗:简易多功能方法 简介: 本文介绍了如何使用 Python 和 AkShare 库对个股数据进行清洗和处理。个股数据经常需要进行清洗以用于分析、建模或可视化。我们将介绍一些简单但功能强大的方法,包括数据加载、缺失值处理、重复值检测和…

Gitlab:从其它项目组里导入一个项目

1.首先获取原项目的http地址 http://ip/projectGroup/ProjectX.git其中,ip 为公司gitlab内网地址。 2.进入目的项目组进行创建 首先,需要拥有一个该组拥有者权限的账号,才能进行后续的操作。 2.1.点击创建项目按钮 2.2.选择导入项目 其中…

03c++重载运算符

1、深入理解new和delete原理 #include<iostream> using namespace std;/* new 和 delete 1、malloc和new的区别 new 内存开辟构造函数 2、free和 delete的区别 delete 内存回收析构函数 开辟失败malloc返nullptr ,new抛出bad_alloc异常new->operator new delete -&…

Docker学习(带图详细)

一、安装docker 参考官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 查看系统版本 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# [rootlocalhost ~]# uname -a Linux localhost.localdomai…

STM32平衡车-MPU6050的DMP库移植

本文目录 一、硬件接线二、需要移植的三个文件夹1. DMP文件夹目录2. IIC文件夹目录3. MPU6050文件夹目录 三、文件内容IO12C.cIO12C.hMPU6050.cMPU6050.hmain.c 四、附录1.更改IIC引脚 一、硬件接线 SCL-- PA11 SDA-- PA12 VCC-- 3.3v GND-- GND INT-- PC9 二、需要移植的三个…

[Kubernetes] Istio on Kubernetes 实践

文章目录 1.Kubernetes 创建2.Istio 部署2.1 下载 Istio2.2 安装 Istio 3.Istio on Kubernetes 实践3.1 部署 Bookinfo 示例应用3.2 确定入站 IP 和端口 1.Kubernetes 创建 主机名内部ip外部ipmaster192.168.66.2139.198.36.40node1192.168.66.3139.198.1.192node2192.168.66.…

数据结构——栈与队列的专题

文章目录 前言一、用队列实现栈二、用栈实现队列三、设计循环队列 前言 本篇是围绕栈与队列来展开&#xff0c;需要知道一定有关它们的相关基础知识 栈的详解 队列的详解 还有一道基础的栈题——有效的括号 一、用队列实现栈 原题链接&#xff1a;用队列实现栈 解题思路&a…

YOLOv5‘YOLOv7涨点必备:改进无参注意力SimAM

论文题目:SimAM: A Simple, Parameter-Free Attention Module for Convolutional Neural Networks 论文地址:http://proceedings.mlr.press/v139/yang21o/yang21o.pdf 源代码:https://github.com/ZjjConan/Sim 1.摘要 本文提出一种概念简单且非常有效的注意力模块。不同于…

攻防世界-web-file_include

题目 解题 通过阅读php代码&#xff0c;我们明显的可以发现&#xff0c;这个一个文件包含的类型题 文件包含漏洞也是一种“注入型漏洞”&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务器端执行。 require()&#xff0c;找不到被包含的文件时…

算法提高之单词接龙

算法提高之单词接龙 核心思想&#xff1a;dfs 预处理每两个字符串之间最短的公共部分长度 求最短公共 最终字符串是最长 dfs所有开头字符串 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 25;int g[N][N…

6818Linux内核开发移植

Linux内核开发移植 Linux内核版本变迁及其获得 Linux是最受欢迎的自由电脑操作系统内核&#xff0c; 是一个用C语言写成&#xff0c; 并且符合POSIX标准的类Unix操作系统 Linux是由芬兰黑客Linus Torvalds开发的&#xff0c; 目的是尝试在英特尔x86架构上提供自由免费的类Un…

nowcoder——回文结构

链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 我们来分析该题&#xff1a;我们首先要清楚什么是回文结构&#xff1f;其实就是对称结构。如果一个链表呈对称结构就说明该链表具有回文结构。 下面给上一些例子&#xff1a; 那我们怎么判断该链表是否属于回文结构呢&#xf…