pytorch05:卷积、池化、激活

目录

  • 一、卷积
    • 1.1 卷积的概念
    • 1.2 卷积可视化
    • 1.3 卷积的维度
    • 1.4 nn.Conv2d
      • 1.4.1 无padding 无stride卷积
      • 1.4.2 无padding stride=2卷积
      • 1.4.3 padding=2的卷积
      • 1.4.4 空洞卷积
      • 1.4.5 分组卷积
    • 1.5 卷积输出尺寸计算
    • 1.6 卷积的维度
    • 1.7 转置卷积
      • 1.7.1 为什么被称为转置卷积
      • 1.7.2 nn.ConvTranspose2d
      • 1.7.3 转置卷积的计算方法
      • 1.7.4 核心代码
  • 二、池化层(Pooling Layer)
    • 2.1 池化的概念
    • 2.2 nn.MaxPool2d
      • 2.2.1 代码实现
    • 2.3 nn.AvgPool2d
      • 2.3.1 代码实现
    • 2.4 最大池化与平均池化区别
    • 2.5 nn.MaxUnpool2d
      • 2.5.1 核心代码实现
  • 三、线性层(Linear Layer)
    • 3.1nn.Linear
  • 四、激活函数层(Activation Layer)
    • 4.1 概念
    • 4.2 nn.Sigmoid激活函数
    • 4.3 nn.tanh激活函数
    • 4.4 nn.ReLU激活函数
    • 4.5 ReLU变体形式

一、卷积

1.1 卷积的概念

卷积运算:卷积核在输入信号(图像)上滑动,相应位置上进行乘加
卷积核:又称为滤波器,过滤器,可认为是某种模式,某种特征。
卷积过程类似于用一个模版去图像上寻找与它相似的区域,与卷积核模式越相似,激活值越高,从而实现特征提取。
在这里插入图片描述

1.2 卷积可视化

AlexNet这篇论文对卷积核进行了可视化,发现卷积核学习到的是边缘,条纹,色彩这一些细节模式,但是只有前几层卷积提取的特征可视化较为明显,随着网络的加深,卷积次数的增加,特征可视化也逐渐模糊。
在这里插入图片描述

1.3 卷积的维度

卷积维度:一般情况下,卷积核在几个维度上滑动,就是几维卷积,下面三幅图分别是一维卷积、二维卷积、三维卷积。我们常见的图片特征提取使用的是二维卷积(conv2d),在医学图像领域用于癌细胞切片分析使用的是三维卷积(conv3d)。
一维卷积
在这里插入图片描述
在这里插入图片描述

1.4 nn.Conv2d

功能:对多个二维信号进行二维卷积,例如图片
主要参数:
• in_channels:输入通道数
• out_channels:输出通道数,等价于卷积核个数
• kernel_size:卷积核尺寸
• stride:步长,卷积核每次移动的长度
• padding :图片边缘填充个数
• dilation:空洞卷积大小,常用于图像分割任务,用来提升感受野
• groups:分组卷积设置
• bias:偏置
在这里插入图片描述

1.4.1 无padding 无stride卷积

每次在原图滑动1个单位
在这里插入图片描述

1.4.2 无padding stride=2卷积

每次在原图滑动两个单位
在这里插入图片描述

1.4.3 padding=2的卷积

在原图的边缘增加2个单位的填充。
在这里插入图片描述

1.4.4 空洞卷积

在这里插入图片描述

1.4.5 分组卷积

同一种张图片使用两个不同的GPU进行训练,最后将两张GPU提取的特征进行融合。在这里插入图片描述

1.5 卷积输出尺寸计算

在这里插入图片描述
完整尺寸计算公式:
在这里插入图片描述
一般我们输入的图像都会进行预处理,将长宽变为相同大小,所以H,W两个公式可以看为相等。

1.6 卷积的维度

卷积维度:一般情况下,卷积核在几个维度上滑动,就是几维卷积,我们的图像是二维图像,卷积核的维度也是二维。
我们的图像是RGB三个通道,所以会在三个二维图像上进行滑动提取特征,最后将红绿蓝三个通道特征提取之后进行相加,得到一个output特征图。
在这里插入图片描述

1.7 转置卷积

转置卷积又称为反卷积(Deconvolution)和部分跨越卷积(Fractionallystrided Convolution) ,用于对图像进行上采样(UpSample)

1.7.1 为什么被称为转置卷积

正常卷积,图片经过卷积之后,等到的特征图尺寸会比原图小
在这里插入图片描述

而转置卷积经过卷积核之后会将原图尺寸方法常用于上采样,提升图片的尺度
在这里插入图片描述

在这里插入图片描述

1.7.2 nn.ConvTranspose2d

功能:转置卷积实现上采样
在这里插入图片描述
主要参数:
• in_channels:输入通道数
• out_channels:输出通道数
• kernel_size:卷积核尺寸
• stride:步长
• padding :填充个数
• dilation:空洞卷积大小
• groups:分组卷积设置
• bias:偏置

1.7.3 转置卷积的计算方法

在这里插入图片描述
完整版本:
在这里插入图片描述

1.7.4 核心代码

flag = 1
if flag:conv_layer = nn.ConvTranspose2d(3, 1, 3, stride=2)  # input:(i, o, size)nn.init.xavier_normal_(conv_layer.weight.data)# calculationimg_conv = conv_layer(img_tensor)

输出结果:
在这里插入图片描述
在这里插入图片描述

二、池化层(Pooling Layer)

2.1 池化的概念

池化运算:对信号进行 “收集”并 “总结”,类似水池收集水资源,因而得名池化层,“收集”:多变少;“总结”:最大值/平均值

池化有最大池化和平均池化
最大池化:取池化范围内最大的数,下图中池化范围2x2,取每个池化范围内数值最大的
平均池化:取池化范围内的平均值,下图中池化范围2x2,取每个池化范围内数值之和,再求平均
在这里插入图片描述

2.2 nn.MaxPool2d

功能:对二维信号(图像)进行最大值池化
在这里插入图片描述
主要参数:
• kernel_size:池化核尺寸
• stride:步长
• padding :填充个数
• dilation:池化核间隔大小
• ceil_mode:尺寸向上取整
• return_indices:记录池化像素索引

2.2.1 代码实现

import os
import torch
import random
import numpy as np
import torchvision
import torch.nn as nn
from torchvision import transforms
from matplotlib import pyplot as plt
from PIL import Image
from common_tools import transform_invert, set_seedset_seed(1)  # 设置随机种子# ================================= load img ==================================
path_img = os.path.join(os.path.dirname(os.path.abspath(__file__)), "lena.png")
img = Image.open(path_img).convert('RGB')  # 0~255# convert to tensor
img_transform = transforms.Compose([transforms.ToTensor()])
img_tensor = img_transform(img)
img_tensor.unsqueeze_(dim=0)  # C*H*W to B*C*H*W# ================ maxpool
flag = 1
# flag = 0
if flag:maxpool_layer = nn.MaxPool2d((2, 2), stride=(2, 2)) #这里为什么池化和步长都设置(2,2),是为了保证每次池化的区域不重叠img_pool = maxpool_layer(img_tensor)
# ================================= 展示图像 ==================================
print("池化前尺寸:{}\n池化后尺寸:{}".format(img_tensor.shape, img_pool.shape))
img_pool = transform_invert(img_pool[0, 0:3, ...], img_transform)
img_raw = transform_invert(img_tensor.squeeze(), img_transform)
plt.subplot(122).imshow(img_pool)
plt.subplot(121).imshow(img_raw)
plt.show()

输出结果,图片大小为原来的一半:
在这里插入图片描述
在这里插入图片描述

2.3 nn.AvgPool2d

功能:对二维信号(图像)进行平均值池化
在这里插入图片描述
主要参数:
• kernel_size:池化核尺寸
• stride:步长
• padding :填充个数
• ceil_mode:尺寸向上取整
• count_include_pad:填充值用于计算
• divisor_override :除法因子

2.3.1 代码实现

核心代码:

flag = 1
# flag = 0
if flag:avgpoollayer = nn.AvgPool2d((2, 2), stride=(2, 2))  # input:(i, o, size) weights:(o, i , h, w)img_pool = avgpoollayer(img_tensor)

输出结果:
在这里插入图片描述
在这里插入图片描述

2.4 最大池化与平均池化区别

下面第一幅图是最大池化,第二幅图是平均池化,因为最大池化取的是一个区域内的最大值,所以第一幅图比第二幅图某些区域更亮,特征更明显。
在这里插入图片描述

2.5 nn.MaxUnpool2d

功能:对二维信号(图像)进行最大值池化进行上采样,但是需要根据池化中的最大值位置索引进行上采样,例如[1,2,0,1]经过最大池化,取第二个位置,当前索引为2,所以[3,2,1,7]进行上采样,其中3是在上采样后索引为2的位置上,其他区域为0.
在这里插入图片描述
在这里插入图片描述
主要参数:
• kernel_size:池化核尺寸
• stride:步长
• padding :填充个数

2.5.1 核心代码实现

flag = 1
if flag:# poolingimg_tensor = torch.randint(high=5, size=(1, 1, 4, 4), dtype=torch.float) # 生成特征图maxpool_layer = nn.MaxPool2d((2, 2), stride=(2, 2), return_indices=True) # 设置池化层img_pool, indices = maxpool_layer(img_tensor) #获取池化后的数据以及索引# unpoolingimg_reconstruct = torch.randn_like(img_pool, dtype=torch.float) #根据img_poolshape随机构建数据maxunpool_layer = nn.MaxUnpool2d((2, 2), stride=(2, 2)) #搭建最大池化上采样层img_unpool = maxunpool_layer(img_reconstruct, indices)print("raw_img:\n{}\nimg_pool:\n{}".format(img_tensor, img_pool))print("索引位置:{}".format(indices))print("img_reconstruct:\n{}\nimg_unpool:\n{}".format(img_reconstruct, img_unpool))

输出结果:
在这里插入图片描述

三、线性层(Linear Layer)

线性层又称全连接层,其每个神经元与上一层所有神经元相连,实现对前一层的线性组合,线性变换。
在这里插入图片描述
在这里插入图片描述
输入的input=[1,2,3],经过加权相乘得到的hidden=[6,1,18,24]

3.1nn.Linear

功能:对一维信号(向量)进行线性组合
在这里插入图片描述
主要参数:
• in_features:输入结点数
• out_features:输出结点数
• bias :是否需要偏置
计算公式:y = 𝒙*𝑾𝑻 + 𝒃𝒊𝒂𝒔

代码实现:

flag = 1
if flag:inputs = torch.tensor([[1., 2, 3]])linear_layer = nn.Linear(3, 4)linear_layer.weight.data = torch.tensor([[1., 1., 1.],[2., 2., 2.],[3., 3., 3.],[4., 4., 4.]])linear_layer.bias.data.fill_(0.5)  # 偏执项,x*w+boutput = linear_layer(inputs)print(inputs, inputs.shape)print(linear_layer.weight.data, linear_layer.weight.data.shape)print(output, output.shape)

输出结果:
在这里插入图片描述

四、激活函数层(Activation Layer)

4.1 概念

激活函数对特征进行非线性变换,赋予多层神经网络具有深度的意义。
为什么要使用激活函数呢,因为输入的特征只是通过线性变换,不过是经过多层网络都还是线性变换,就如下面这幅图的计算公式一样。
在这里插入图片描述

4.2 nn.Sigmoid激活函数

函数图像:
在这里插入图片描述
计算公式:
在这里插入图片描述

4.3 nn.tanh激活函数

函数图像:
在这里插入图片描述
计算公式:
在这里插入图片描述

4.4 nn.ReLU激活函数

函数图像:
在这里插入图片描述
计算公式:
在这里插入图片描述

4.5 ReLU变体形式

nn.LeakyReLU:在负半轴添加一点斜率;
nn.PReLU:将负半轴的斜率变为可学习的;
nn.RReLU:负半轴的斜率上下均匀分布;
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Grafana增加仪表盘

1.Grafana介绍 grafana 是一款采用Go语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库。 Grafana下载地址:https://grafana.com/g…

Python+OpenGL绘制3D模型(六)材质文件载入和贴图映射

系列文章 一、逆向工程 Sketchup 逆向工程(一)破解.skp文件数据结构 Sketchup 逆向工程(二)分析三维模型数据结构 Sketchup 逆向工程(三)软件逆向工程从何处入手 Sketchup 逆向工程(四&#xf…

Java强软弱虚引用

面试: 1.强引用,软引用,弱引用,虚引用分别是什么? 2.软引用和弱引用适用的场景? 3.你知道弱引用的话,能谈谈WeakHashMap吗? 目录 一、Java引用 1、强引用(默认支持模式…

05-C++ 类和对象-继承

类与对象-03 继承与派生 1. 继承的概念 c最重要的特征是代码重用,通过继承机制可以利用已有的数据类型,来定义新的数据类型,新的类不仅拥有旧类的成员,还拥有新定义的成员。 一个 B 类继承于 A 类,或称从类 A 派生…

菜鸟网络Java实习一面面经

自我介绍,做过的项目 巴拉巴拉 你项目中用到redis,可以介绍一下为什么使用它吗? 基于内存操作,内存读写速度快。 支持多种数据类型,包括String、Hash、List、Set、ZSet等。 支持持久化。Redis支持RDB和AOF两种持久…

K8S异常处理

一、概述 1、k8s有时候会报错The connection to the server ip:6443 was refused - did you specify the right host or port ,本文档提供几种可能产生该报错的原因和排障思路。 二、发现问题 使用任意Kubectl 命令会报错:The connection to the serv…

JVM GC 算法原理概述

对于JVM的垃圾收集(GC),这是一个作为Java开发者必须了解的内容,那么,我们需要去了解哪些内容呢,其实,GC主要是解决下面的三个问题: 哪些内存需要回收? 什么时候回收&…

透过许战海矩阵洞察安记食品增长战略

引言:安记食品如果想实施增长战略,建议深耕招牌产品,走向全国市场,目前招牌产品咖哩和复合调味粉市场空间没有被全面释放出来,需要科学的产品战略作为支撑。安记食品选择功能性产品方向是正确的,但“功能性”需要一个大品类作为载体,牛奶,饮料是最大的载…

SpringBoot - Maven 打包合并一个胖 JAR 以及主项目 JAR 依赖 JAR 分离打包解决方案

问题描述 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.1.18.RELEASE</version><configuration><!--<classifier>exec</classifier>--…

产品经理学习-怎么写PRD文档

目录 瀑布流方法论介绍 产品需求文档&#xff08;PRD&#xff09;介绍 产品需求文档的基本要素 撰写产品需求文档 优先产品需求文档的特点 其他相关文档 瀑布流方法论介绍 瀑布流模型是一种项目的开发和管理的方法论&#xff0c;是敏捷的开发管理方式相对应的另一种方法…

Google机器人团队获ICRA 2023 机器人学习方向最佳论文奖:机器人实体控制的大语言模型程序

这篇论文主要讨论了大型语言模型&#xff08;LLM&#xff09;在机器人控制方面的应用。作者们指出&#xff0c;尽管LLM在理解和生成自然语言方面表现出色&#xff0c;但其在实际应用中&#xff0c;如机器人控制等领域的应用仍然有限。因此&#xff0c;他们提出了一种新的方法&a…

通过栈将中缀表达式转换为等价的后缀表达式

为什么要从中缀表达式转换为等价的后缀表达式&#xff1f; →使后缀表达式包含运算符优先级的信息&#xff0c;方便计算机能理解进行运算。 什么是中缀表达式&#xff1f; →中缀表达式虽然是人类看得懂的简单算术形式&#xff0c;但对计算机来说反而复杂难以理解 什么是后缀表…

【头歌实训】PySpark Streaming 入门

文章目录 第1关&#xff1a;SparkStreaming 基础 与 套接字流任务描述相关知识Spark Streaming 简介Python 与 Spark StreamingPython Spark Streaming APISpark Streaming 初体验&#xff08;套接字流&#xff09; 编程要求测试说明答案代码 第2关&#xff1a;文件流任务描述相…

<JavaEE> TCP 的通信机制(三) -- 滑动窗口

目录 TCP的通信机制的核心特性 四、滑动窗口 1&#xff09;什么是滑动窗口&#xff1f; 2&#xff09;滑动窗口的作用是什么&#xff1f; 3&#xff09;批量传输出现丢包如何处理&#xff1f; 1> 接收端ACK丢包 2> 发送端数据包丢包 4&#xff09;适用性 TCP的通…

Mysql 容易忘的 sql 指令总结

目录 一、操作数据库的基本指令 二、查询语句的指令 1、基本查询语句 2、模糊查询 3、分支查询 4、 分组查询 5、分组查询 6、基本查询总结&#xff1a; 7、子查询 8、连接查询 三、MySQL中的常用函数 1、时间函数 2、字符串函数 3、聚合函数 4、运算函数 四、表…

【elk-day01】es和kibana搭建及验证---Mac-Docker

Mac系统使用Docker下载搭建和验证eskibana Docker下载安装es安装es验证kibana安装kibana验证 Docker下载安装 Docker Desktop官网安装下载地址 说明一下为什么要安装desktop版本的docker&#xff0c;因为docker作为工具使用&#xff0c;我们需要的是开箱即用&#xff0c;没有必…

QT中的信号与槽的讲解

文章目录 信号及其特点槽及其特点代码演示标准信号与标准槽函数方式一方式二 自定义信号和槽connect()函数信号和槽函数存在函数重载的情况下Qt的信号槽机制注意事项 信号及其特点 信号&#xff1a;是一种特殊的函数&#xff0c;又称信号函数&#xff0c;俗称信号&#xff0c;…

2023年新一代开发者工具 Vue ,正式开源!

以下文章来源于前端充电宝 &#xff0c;作者CUGGZ 近日&#xff0c;Vue 新一代开发者工具&#xff08;DevTools&#xff09;正式开源&#xff01;Vue DevTools 是一个旨在增强 Vue 开发人员体验的工具&#xff0c;它提供了一些功能来帮助开发者更好地了解 Vue 应用。下面就来看…

第九部分 图论

目录 例 相关概念 握手定理 例1 图的度数列 例 无向图的连通性 无向图的连通度 例2 例3 有向图D如图所示&#xff0c;求 A, A2, A3, A4&#xff0c;并回答诸问题&#xff1a; 中间有几章这里没有写&#xff0c;感兴趣可以自己去学&#xff0c;组合数学跟高中差不多&#xff0c…

记录汇川:MODBUS TCP-梯形图

H5U的MODBUS通信不需要编写程序&#xff0c;通过组态MODBUS通信配置表&#xff0c;实现数据通信。 Modbus-TCP 主站即Modbus-TCP客户端&#xff0c;通过Modbus-TCP配置&#xff0c;可最多支持同时与31个 Modbus-TCP服务器&#xff08;从站&#xff09;进行通讯。 …