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.hqwc.cn/news/311716.html

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

相关文章

ssm基于Web的老年公寓信息管理系统论文

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差&#x…

【远程开发】穿越跳板机和CLion远程开发——全面配置流程

文章目录 穿越跳板机配置 ProxyJump 方案Cygwin上的配置 建立 SSH Tunneling 方案 代码映射目录映射方案配置Rsync加速 远程服务器方案(todo) 远程Debug tips:本文讲了两种穿越跳板机的方案(推荐ProxyJump方案),和两种代码映射的方案。实际任选一对搭配即…

Hive中支持毫秒级别的时间精度

实际上,Hive 在较新的版本中已经支持毫秒级别的时间精度。你可以通过设置 hive.exec.default.serialization.format 和 mapred.output.value.format 属性为 1,启用 Hive 的时间精度为毫秒级。可以使用以下命令进行设置: set hive.exec.defau…

【小沐学Python】Python实现免费天气预报获取(OpenWeatherMap)

文章目录 1、简介1.1 工具简介1.2 费用1.3 注册1.4 申请key 2、接口说明2.1 One Call 3.02.2 Current Weather and Forecasts collection2.2.1 API 调用2.2.2 API 参数 2.3 Historical Weather collection2.4 Weather Maps collection2.5 Other weather APIs 3、接口测试3.1 例…

计算机毕业设计 基于html5的图书管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

Armpro脱壳软件搭建教程附源代码

PHP8.0版本,数据库8.0版本 1.配置注册机文件,打开将arm.zip/res目录下,mt管理器搜索将其全部修改为你自己的域名或者是服务器IP 2.然后建立数据库 数据库账号arm 数据库用户名arm 数据库密码EsZfXY4tD3h2NNA4 3.导入数据库 4.配置Redi…

[NCTF 2022]calc

[NCTF 2022]calc 考点:python环境变量注入 打开题目,F12有hint 访问一下得到源码 app.route("/calc",methods[GET]) def calc():ip request.remote_addrnum request.values.get("num")log "echo {0} {1} {2}> ./tmp/log…

从实际工作情况,介绍嵌入式(MCU)软件开发常用(通用)工具

目录 前言 1、代码阅读及编辑工具(VSCode、Understand) 2、代码对比工具(Beyond Compare) 3、代码仓库相关工具(Git、SVN、Tortoise) 4、文本编辑器(Notepad) 5、电脑文件搜索工…

腾讯云标准型S5服务器2核2G、2核4G和4核8G五年机来了

腾讯云五年特价服务器来了,标准型S5云服务器,可选2核2G、2核4G和4核8G配置,一次性购买五年低至2折,免去续费贵烦恼。腾讯云百科txybk.com分享腾讯云5年服务器特价优惠活动、购买条件、云服务器配置及优惠价格: 腾讯云五…

Python高级用法:生成器(generator)

生成器(generator) 生成器是一种返回生成序列的方法,与直接使用列表等方式返回序列的方式不同的是,他的生成可以是无限的。 生成器可以与next搭配使用,可以被看作是一种特殊的迭代器。 yield语句 yield一般与循环相…

[NISACTF 2022]babyupload

[NISACTF 2022]babyupload wp 信息搜集 进入页面: 尝试文件上传,但是各种后缀名我都试过了,过不去。 在源码中发现提示,存在 ./source 路径: 访问该路径得到源码: from flask import Flask, request, r…

【Leetcode】1154. 一年中的第几天

文章目录 题目思路代码 题目 1154. 一年中的第几天链接 思路 题目要求是给定一个字符串 date,它代表一个日期,采用标准的 YYYY-MM-DD 格式。需要计算这个日期是当年的第几天。 首先,我们可以通过字符串的索引来提取年、月和日的数值&…