PyTorch - Conv2d 和 MaxPool2d
文章目录
- Conv2d
- 计算
- Conv2d 函数解析
- 代码示例
- MaxPool2d
- 计算
- 函数说明
- 卷积过程动画
- Transposed convolution animations
- Transposed convolution animations
参考视频:土堆说 卷积计算
https://www.bilibili.com/video/BV1hE411t7RN
关于 torch.nn 和 torch.nn.function
torch.nn 是对 torch.nn.function 的封装,前者更方便实用。
Conv2d
卷积过程可见文末动画
计算
卷积层输入特征图(input feature map)的尺寸为:H_i × W_i × C_i
- H_i :输入特征图的高
- W_i :输入特征图的宽
- C_i :输入特征图的通道数
(如果是第一个卷积层则是输入图像的通道数,如果是中间的卷积层,则是上一层的输出通道数
卷积层的参数如下:
- P:padding,补零的行数和列数
- F:正方形卷积核的边长
- S:stride,步幅
- K:输出通道数
输出特征图(output feature map)的尺寸为 H_o × W_o × C_o
,其中每一个变量的计算方式如下:
- H_o = (H_i + 2P − F)/S + 1
- W_o = (W_i + 2P − F)/S + 1
- C_o = K
- 卷积时,超出边界的不计算。
参数量大小的计算,分为weights和biases:
首先,计算weights的参数量:F × F × C_i × K
接着计算biases的参数量:K
所以总参数量为:F × F × C_i × K + K
计算示例
输入 | 卷积核 | 步长 | padding | 输出 | 计算 |
---|---|---|---|---|---|
5x5 | 2x2 | 1 | 0 | 4x4 | 4 = (5-2)/1 + 1 |
5x5 | 3x3 | 1 | 0 | 3x3 | 3 = (5-3)/1 + 1 |
5x5 | 2x2 | 2 | 0 | 2x2 | 2 = (5-2)/2 + 1 |
6x6 | 2x2 | 2 | 0 | 3x3 | 3 = (6-2)/2 + 1 |
5x5 | 2x2 | 1 | 1 | 6x6 | 4 = (5 + 1*2 - 2)/1 + 1 |
5x5 | 3x3 | 1 | 1 | 5x5 | 3 = (5 + 1*2 - 3)/1 + 1 |
5x5 | 3x3 | 2 | 2 | 4x4 | 3 = (5 + 2*2 - 3)/2 + 1 |
Conv2d 函数解析
torch.nn.functional.conv2d
官方说明
https://pytorch.org/docs/stable/generated/torch.nn.functional.conv2d.html#torch.nn.functional.conv2d
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode=‘zeros’, device=None, dtype=None)
- in_channels
- out_channels
- kernel_size,卷积核大小;可以是一个数(n*n矩阵),也可以是一个元组。这个值在训练过程中,会不断被调整。
- stride=1
- padding=0
- dilation=1,卷积核对应位的距离
- groups=1,分组卷积;一般为1,很少改动。
- bias=True,偏置,一般为True
- padding_mode=‘zeros’,如果设置了 padding,填充模式。默认为 zeros,即填充0。
- device=None
- dtype=None)
一般只设置前五个参数
代码示例
import torch
import torch.nn.functional as Ft1 = 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], ])kernel = torch.Tensor([[1, 2, 1],[0, 1, 0],[2, 1, 0]
])
t1.shape, kernel.shape
# (torch.Size([5, 5]), torch.Size([3, 3]))# channel 和 batch_size 为 1
ip = torch.reshape(t1, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))
ip.shape, kernel.shape
# (torch.Size([1, 1, 5, 5]), torch.Size([1, 1, 3, 3]))op = F.conv2d(ip, kernel, stride=1)
op, op.shape
'''
(tensor([[[[10., 12., 12.],[18., 16., 16.],[13., 9., 3.]]]]),torch.Size([1, 1, 3, 3]))
'''# 不同 stride
op = F.conv2d(ip, kernel, stride=2)
op, op.shape
'''
(tensor([[[[10., 12.],[13., 3.]]]]),torch.Size([1, 1, 2, 2]))
'''# 增加 padding
op = F.conv2d(ip, kernel, stride=2, padding=1)
op, op.shape
'''
(tensor([[[[ 1., 4., 8.],[ 7., 16., 8.],[14., 9., 4.]]]]),torch.Size([1, 1, 3, 3]))
'''
MaxPool2d
池化的目的是保留特征,减少数据量;
最大池化也被称为 下采样;
另外池化操作是分别应用到每一个深度切片层。输出深度 与 输入的深度 相同。
计算
- 输入宽高深:H_i,W_i, D_i
- 滤波器宽高:f_w, f_h
- S: stride,步长
输出为:
H_o = (H_i - f_h)/S + 1
W_o = (W_i - f_w)/S + 1
D_o = D_i
输入维度是 4x4x5 (HxWxD)
滤波器大小 2x2 (HxW)
stride 的高和宽都是 2 (S)
函数说明
- 官方说明
https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html#torch.nn.MaxPool2d
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
- ceil_mode,超出范围时是否计算
代码实现
import torch
import torch.nn as nn# MaxPool2d 函数 input 需要是 4维
ip = torch.reshape(t1, (-1, 1, 5, 5))class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.maxpool = nn.MaxPool2d(kernel_size=3, ceil_mode=True)
# self.maxpool = nn.MaxPool2d(kernel_size=3, ceil_mode=False)def forward(self, input):output = self.maxpool(input)return outputnet = Net()
ret = net(ip)
ret# tensor([[[[2., 3.], [5., 1.]]]]) # ceil_mode=True
# tensor([[[[2.]]]]) # ceil_mode=False
数据集中调用
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdata_path = '/xxxx/cifar10'
datasets = torchvision.datasets.CIFAR10(data_path, train=False, download=True, transform=torchvision.transforms.ToTensor())data_loader = DataLoader(datasets, batch_size=64)class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.maxpool1 = nn.MaxPool2d(kernel_size=3, ceil_mode=False)
# self.maxpool = nn.MaxPool2d(kernel_size=3, ceil_mode=False)def forward(self, input):output = self.maxpool1(input)return outputwriter = SummaryWriter('logs_maxpool1')
step = 0
net = Net()
for data in data_loader:imgs, targets = datawriter.add_images('input', imgs, step)output = net(imgs) writer.add_images('output', output, step)step = step + 1writer.close()
- 启动 tensorboard:
tensorboard --logdir=logs_maxpool1
卷积过程动画
图片来自:https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
Transposed convolution animations
No padding, no strides
Arbitrary padding, no strides
Half padding, no strides
Full padding, no strides
No padding, strides
Padding, strides
Padding, strides (odd)
Transposed convolution animations
No padding, no strides, transposed
Arbitrary padding, no strides, transposed
Half padding, no strides, transposed
Full padding, no strides, transposed
No padding, strides, transposed
Padding, strides, transposed
Padding, strides, transposed (odd)
相关文章:

PyTorch - Conv2d 和 MaxPool2d
文章目录Conv2d计算Conv2d 函数解析代码示例MaxPool2d计算函数说明卷积过程动画Transposed convolution animationsTransposed convolution animations参考视频:土堆说 卷积计算 https://www.bilibili.com/video/BV1hE411t7RN 关于 torch.nn 和 torch.nn.function t…...
leetcode Day2(昨天实习有点bug,心态要崩了)
int carry 0;for(int i a.size() - 1, j b.size() - 1; i > 0 || j > 0 || carry; --i, --j) {int x i < 0 ? 0 : a[i] - 0;int y j < 0 ? 0 : b[j] - 0;int sum (x y carry) % 2;carry (x y carry) / 2;str.insert(0, 1, sum 0);}return str;加一&a…...
另一种思考:为什么不选JPA、MyBatis,而选择JDBCTemplate
以下内容转载自:https://segmentfault.com/a/1190000018472572 作者:scherman 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的…...
LeetCode 338. 比特位计数
给你一个整数 n ,对于 0 < i < n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n 1 的数组 ans 作为答案。 示例 1: 输入:n 2 输出:[0,1,1] 解释: 0 --> 0 1 --> …...

排序评估指标——NDCG和MAP
在搜索和推荐任务中,系统常返回一个item列表。如何衡量这个返回的列表是否优秀呢? 例如,当我们检索【推荐排序】,网页返回了与推荐排序相关的链接列表。列表可能会是[A,B,C,G,D,E,F],也可能是[C,F,A,E,D],现在问题来了…...

[Android Studio] Android Studio Virtual Device(AVD)虚拟机的功能试用
🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪 Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 🚀write…...

kafka-3-kafka应用的核心要点和内外网访问
kafka实战教程(python操作kafka),kafka配置文件详解 Kafka内外网访问的设置 1 kafka简介 根据官网的介绍,ApacheKafka是一个分布式流媒体平台,它主要有3种功能: (1)发布和订阅消息流,这个功能类似于消息队列&#x…...

VS2017+OpenCV4.5.5 决策树-评估是否发放贷款
决策树是一种非参数的监督学习方法,主要用于分类和回归。 决策树结构 决策树在逻辑上以树的形式存在,包含根节点、内部结点和叶节点。 根节点:包含数据集中的所有数据的集合内部节点:每个内部节点为一个判断条件,并且…...

Prometheus 记录规则和警报规则
前提环境: Docker环境 涉及参考文档: Prometheus 录制规则Prometheus 警报规则 语法检查规则 promtool check rules /path/to/example.rules.yml一:录制规则语法 groups 语法: groups:[ - <rule_group> ]rule_group…...

(API)接口测试的关键技术
接口测试也就是API测试,从名字上可以知道是面向接口的测试活动。所以在讲API测试之前,我们应该说清楚接口是什么,那么接口就是有特定输入和特定输出的一套逻辑处理单元,而对于接口调用方来说,不用知道自身的内部实现逻…...

快速排序算法原理 Quicksort —— 图解(精讲) JAVA
快速排序是 Java 中 sort 函数主要的排序方法,所以今天要对快速排序法这种重要算法的详细原理进行分析。 思路:首先快速排序之所以高效一部分原因是利用了离散数学中的传递性。 例如 1 < 2 且 2 < 3 所以可以推出 1 < 3。在快速排序的过程中巧…...

linux环境搭建私有gitlab仓库
搭建之前,需要安装相应的依赖包,并且要启动sshd服务(1).安装policycoreutils-python openssh-server openssh-clients [rootVM-0-2-centos ~]# sudo yum install -y curl policycoreutils-python openssh-server openssh-clients [rootVM-0-2-centos ~]…...
SpringSecurity授权
文章目录工具类使用自定义失败处理代码配置跨域其他权限授权hasAnyAuthority自定义权限校验方法基于配置的权限控制工具类 import javax.servlet.http.HttpServletResponse; import java.io.IOException;public class WebUtils {/*** 将字符串渲染到客户端** param response 渲…...

学习 Python 之 Pygame 开发坦克大战(一)
学习 Python 之 Pygame 开发坦克大战(一)Pygame什么是Pygame?初识pygame1. 使用pygame创建窗口2. 设置窗口背景颜色3. 获取窗口中的事件4. 在窗口中展示图片(1). pygame中的直角坐标系(2). 展示图片(3). 给部分区域设置颜色5. 在窗口中显示文字6. 播放音…...

2.5|iot冯|方元-嵌入式linux系统开发入门|2.13+2.18
一、 Linux 指令操作题(共5题(共 20 分,每小题 4分)与系统工作、系统状态、工作目录、文件、目录、打包压缩与搜索等主题相关。1.文件1.1文件属性1.2文件类型属性字段的第1个字符表示文件类型,后9个字符中,…...
一起Talk Android吧(第四百九十六回:自定义View实例二:环形进度条)
文章目录 知识回顾实现思路实现方法示例代码各位看官们大家好,上一回中咱们说的例子是"如何使用Java版MQTT客户端",这一回中咱们说的例子是"自定义View实例二:环形进度条"。闲话休提,言归正转,让我们一起Talk Android吧! 知识回顾 看官们,我们又回…...
上传图片尺寸校验
使用方法 ● Image ● URL ● onload代码: async validImageSize(file, imgWidth, imgHeight) {const img new Image()img.src URL.createObjectURL(file)const { w, h } await new Promise((resolve, reject) > {img.onload () > {const { width: w, he…...
【Python】缺失值处理和拉格朗日插值法(含源代码实现)
目录:缺失值处理和拉格朗日插值法一、前言二、理论知识三、代码实现一、前言 对于含有缺失值的数据集,如果通过删除小部分记录达到既定的目标,那么删除含有缺失值的记录的方法是最有效的。然而,这种方法也有很多问题,…...

SpringCloudAlibaba-Sentinel
一、介绍官网:https://github.com/alibaba/Sentinel/下载jar包,启动,访问http://localhost:8080/创建module添加如下依赖<!--SpringCloud ailibaba sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring…...

【程序化天空盒】过程记录02:云扰动 边缘光 消散效果
写在前面 写在前面唉,最近筋疲力竭,课题组的东西一堆没做,才刚刚开始带着思考准备练习作品,从去年5月份开始到现在真得学了快一年了,转行学其他的真的好累,,不过还是加油! 下面是做…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...

stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...