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)
    # calculation
    img_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_seed

set_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:
    # pooling
    img_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) #获取池化后的数据以及索引

    # unpooling
    img_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+b
    output = 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:负半轴的斜率上下均匀分布;
在这里插入图片描述

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

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

相关文章

【java爬虫】获取个股详细数据并用echarts展示

前言 前面一篇文章介绍了获取个股数据的方法,本文将会对获取的接口进行一些优化,并且添加查询数据的接口,并且基于后端返回数据编写一个前端页面对数据进行展示。 具体的获取个股数据的接口可以看上一篇文章 【java爬虫】基于springbootjd…

ansible管理windows测试

一、环境介绍 Ansible管理主机: 系统: redhat7.6 Linux管理服务器需安装pywinrm插件 Windows客户端主机: 系统: Server2012R2 Windows机器需要安装或升级powershell4.0以上版本,Server2008R2默认的版本是2.0,因此必须升…

欢迎来到Web3.0的世界:Solidity智能合约安全漏洞分析

智能合约概述 智能合约是运行在区块链网络中的一段程序,经由多方机构自动执行预先设定的逻辑,程序执行后,网络上的最终状态将不可改变。智能合约本质上是传统合约的数字版本,由去中心化的计算机网络执行,而不是由政府…

Android Studio配置国内镜像源和HTTP代理/解决:Android Studio下载gradle速度慢的问题

(方案一)Android Studio配置国内镜像源和HTTP代理 一、配置国内镜像源/依赖库 1.1 打开项目的setting.gradle.kts文件 配置进去 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https:…

Qt 5.9.4 转 Qt 6.6.1 遇到的问题总结(一)

最近公司对大家的开发的硬件环境进行了升级,电脑主机的配置、显示器(两台大屏显示器)变得的逼格高多了。既然电脑上的开发环境都需要重装,就打算把开发环境也升级到最新版本,要用就用最新版本。下面对升级后的开发环境…

每日一题——LeetCode976

方法一 个人方法 找规律: 要求要围成三角形且周长最大,那么三条边自然是越大且越接近越好。那么我们就从最大的三条边开始看能不能围成三角形。如果不能组成三角形,则丢弃最长的那条,再取剩余边里最长的那条再看能不能组成三角形…

汽车制造厂批量使用成华制造弹簧平衡器

数年来,成华制造都在不断的向各行各界输出着自己的起重设备,与众多企业达成合作,不断供应优质产品。近些年,成华制造以其卓越的产品质量和高效的生产能力,成功实现了弹簧平衡器的大规模批量供应,为重庆数家…

R统计学1 - 基础操作入门问题1-20

R统计学入门基础问题 1. 如何生成100个高斯&#xff08;正态&#xff09;分布随机数 x <- rnorm(100, mean 5, sd 0.1) x # [1] 4.893534 5.046611 5.081097 4.979164 5.181700 5.038192 5.135376 5.173346 4.968877 4.986146 # [11] 4.946258 5.198199 5.055531 4.9430…

Git:远程仓库的使用

查看当前的远程库 要查看当前配置有哪些远程仓库&#xff0c;可以用git remote 命令&#xff0c;它会列出每个远程库的简短名字。在克隆完某个项目后&#xff0c;至少可以看到一个名为origin 的远程库&#xff0c;Git 默认使用这个名字来标识你所克隆的原始仓库&#xff1a; 也…

RHCE9学习指南 第13章 硬盘管理

新的硬盘首先需要对硬盘进行分区和格式化&#xff0c;首先了解一下硬盘的结构&#xff0c;如图13-1所示。 图13-1 磁盘上的磁道和扇区 硬盘的磁盘上有一个个的圈&#xff0c;每两个圈组成一个磁道。从中间往外发射线&#xff0c;把每个磁道分成一个个的扇区&#xff0c;每个扇…

QT上位机开发(第一个应用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 不管是软件&#xff0c;还是硬件&#xff0c;如果我们能够顺利启动第一个应用&#xff0c;点亮第一个电路的话&#xff0c;这对我们的信心来说会有…

【MySQL】主从异步复制配置

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

Spring Boot快速搭建一个简易商城项目【完成登录功能且优化】

完成登录且优化&#xff1a; 未优化做简单的判断&#xff1a; 全部异常抓捕 优化&#xff1a;返回的是json的格式 BusinessException&#xff1a;所有的错误放到这个容器中&#xff0c;全局异常从这个类中调用 BusinessException&#xff1a; package com.lya.lyaspshop.exce…

unity学习笔记----游戏练习03

一、修复植物种植的问题 1.当手上存在植物时&#xff0c;再次点击卡片上的植物就会在手上添加新的植物&#xff0c;需要修改成只有手上没有植物时才能再次获取到植物。需要修改AddPlant方法。 public bool AddPlant(PlantType plantType) { //防止手上出现多个植…

《深入理解C++11:C++11新特性解析与应用》笔记五

第五章 提高类型安全 5.1 强类型枚举 5.1.1 枚举&#xff1a;分门别类与数值的名字 具名枚举类型一般声明类似&#xff1a;enum Gender { Male, Female }。 匿名枚举类型可以使用三种方式实现&#xff1a; 第一种方式时宏&#xff0c;比如 #define Male 0 #define Femal…

安全生产知识竞赛活动方案

为进一步普及安全生产法律法规知识&#xff0c;增强安全意识&#xff0c;提高安全技能&#xff0c;经研究&#xff0c;决定举办以“加强安全法治、保障安全生产”为主题的新修订《安全生产法》知识竞赛活动&#xff0c;现将有关事项通知如下&#xff1a; 一、活动时间&#xf…

机器学习(二) -- 数据预处理(3)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 未完待续…… 目录 前言 tips&#xff1a;这里只是总结&#xff0c;不是教程哈。本章开始会用到numpy&#xff0c;pandas以及matpl…

【Kubernetes】什么是 kubectl ?

什么是 kubectl &#xff1f; 1.什么是 kubectl &#xff1f;2.Kubernetes 内部结构3.Kubernetes API 的作用 1.什么是 kubectl &#xff1f; 在学习如何更有效地使用 kubectl 之前&#xff0c;您应该对它是什么以及它如何工作有一个基本的了解。从用户的角度来看&#xff0c;…

助力打造智慧数字课堂,基于YOLOv8全系列【n/s/m/l/x】不同参数量级模型开发构建教学课堂场景下学生课堂行为检测识别分析系统

近年来&#xff0c;随着行为检测技术的发展&#xff0c;分析学生在课堂视频中的行为&#xff0c;以获取他们的课堂状态和学习表现信息已经成为可能。这项技术对学校的教师、管理人员、学生和家长都非常重要。使用深度学习方法自动检测学生的课堂行为是分析学生课堂表现和提高教…

计算机视觉技术-目标检测数据集

目标检测领域没有像MNIST和Fashion-MNIST那样的小数据集。 为了快速测试目标检测模型&#xff0c;我们收集并标记了一个小型数据集。 首先&#xff0c;我们拍摄了一组香蕉的照片&#xff0c;并生成了1000张不同角度和大小的香蕉图像。 然后&#xff0c;我们在一些背景图片的随机…