Torch -- 卷积学习day1 -- 卷积层,池化层

目录

一、CNN概述

二、卷积层

1、卷积核

2、卷积计算

3、边缘填充

4、步长

5、多通道卷积计算

6、多卷积核卷积计算

7、特征图大小

8、卷积参数共享

9、局部特征提取

10、卷积层API

三、池化层

1、池化层概述

1.池化层的作用

2.池化层类型

2、池化层计算

3、步长

4、边缘填充

5、多通道池化计算

6、池化API

1. 最大池化 (MaxPooling)

2. 平均池化 (AvgPooling)

3. 自适应池化 (Adaptive Pooling)

四、综合


一、CNN概述

视觉处理三大任务:图像分类、目标检测、图像分割

上游:提取特征,CNN

下游:分类、目标、分割等,具体的业务

CNN网络主要有三部分构成:卷积层、池化层和全连接层构成,其中卷积层负责提取图像中的局部特征;池化层用来大幅降低运算量并特征增强;全连接层类似神经网络的部分,用来输出想要的结果。

卷积操作是CNN的核心特征提取机制,包含两个关键过程:

  • :卷积核在输入数据上按顺序滑动(从左到右,从上到下)

  • :卷积核与局部区域进行逐元素乘积求和

  1. 局部连接

    • 局部连接可以更好地利用图像中的结构信息,空间距离越相近的像素其相互影响越大。

    • 根据局部特征完成目标的可辨识性。

  2. 权重共享

    • 图像从一个局部区域学习到的信息应用到其他区域。

    • 减少参数,降低学习难度。

import torch
from matplotlib import pyplot as plt
import torch.nn as nn
import os
​
​
image_path = os.path.relpath(os.path.join(os.path.dirname(__file__), 'data', '彩色.png'))
# img_data (H, W, C)------>转变为(C, H, W)------>转变为(N, C, H, W)
img_data = plt.imread(image_path)
print(img_data.shape)
img_data = torch.tensor(img_data.transpose(2, 0, 1)).unsqueeze(0)
print(img_data.shape)
​
conv1 = nn.Conv2d(in_channels=4, # 输入通道数(RGBA图像为4)out_channels=16,# 输出通道数(16个卷积核)kernel_size=3,# 卷积核大小3x3stride=1,  # 步长为1
)
# conv1 ----->(1,16,499,498)
conv2 = nn.Conv2d(in_channels=16,out_channels=32,kernel_size=3,stride=1,
)
# conv2 ----->(1,32,497,496)
conv3 = nn.Conv2d(in_channels=32,out_channels=2,kernel_size=3,stride=1,
)
# conv3 ----->(1,2,495,494)
#
out = conv1(img_data)
​
out = conv2(out)
out = conv3(out)
out_ = out.squeeze(0)[1]
​
print(out_.shape)
# out = out.squeeze(0).detach().numpy().transpose(1, 2, 0)
#
# plt.imshow(out)
# plt.show()

二、卷积层

1、卷积核

卷积核是卷积运算过程中必不可少的一个“工具”,在卷积神经网络中,卷积核是非常重要的,它们被用来提取图像中的特征。

卷积核其实是一个小矩阵,在定义时需要考虑以下几方面的内容:

  • 卷积核的个数:卷积核(过滤器)的个数决定了其输出特征矩阵的通道数

  • 卷积核的值:卷积核的值是初始化好的,后续进行更新。

  • 卷积核的大小:常见的卷积核有1×1、3×3、5×5等,一般都是奇数 × 奇数。

2、卷积计算

卷积的重要性在于它可以将图像中的特征与卷积核进行卷积操作,从而提取出图像中的特征

可以通过不断调整卷积核的大小、卷积核的值和卷积操作的步长,可以提取出不同尺度和位置的特征。

  1. input 表示输入的图像

  2. filter 表示卷积核, 也叫做滤波器

  3. output 经过 filter 的得到输出为最右侧的图像,该图叫做特征图

3、边缘填充

边缘填充还更好的保护了图像边缘数据的特征。

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

4、步长

按照步长为1来移动卷积核,计算特征图如下所示:

如果我们把 Stride 增大为2,也是可以提取特征图的,如下图所示:

stride太小:重复计算较多,计算量大,训练效率降低; stride太大:会造成信息遗漏,无法有效提炼数据背后的特征;

示例:

import torch.nn as nn
import torch
def test1(input):conv = nn.Conv2d(in_channels=3, #输入通道数out_channels=128, #输出通道数kernel_size=3, #卷积核大小stride=1,#步长bias=True #使用偏置顶padding #)name_par=conv.named_parameters() #for name, param in name_par:print(name, param.size())out = conv(input)return out
if __name__ == '__main__':input_data = torch.randn(5,3,224,224)out = test1(input_data)print(out.shape)

5、多通道卷积计算

计算方法如下:

  1. 当输入有多个通道(Channel), 例如RGB三通道, 此时要求卷积核需要有相同的通道数。

  2. 卷积核通道与对应的输入图像通道进行卷积。

  3. 将每个通道的卷积结果按位相加得到最终的特征图。

6、多卷积核卷积计算

7、特征图大小

输出特征图的大小与以下参数息息相关:

  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

8、卷积参数共享

  • 减少参数量 同一卷积核在整个输入图像上滑动使用,避免每个位置学习独立权重。 示例1000×1000 输入图像 + 全连接层 → 需 10^6 权重/神经元 同场景 3×3 卷积核 → 仅需 9个权重(减少 > 10万倍!)

  • 保障平移不变性(Translation Invariance) 相同特征(如边缘)无论出现在图像何处,均由同一卷积核检测

9、局部特征提取

  • 聚焦局部模式 卷积核仅连接输入的小局部区域(如 3×3),避免全连接对全局噪声敏感。

  • 分层特征抽象: 浅层提取基础特征(边缘/纹理) → 中层组合局部结构 → 高层理解语义对象。

10、卷积层API

1. nn.Conv1d - 一维卷积

torch.nn.Conv1d(in_channels,        # 输入通道数out_channels,       # 输出通道数(卷积核数量)kernel_size,        # 卷积核大小(整数或元组)stride=1,           # 步长(默认1)padding=0,          # 填充(默认0)dilation=1,         # 空洞卷积率(默认1)groups=1,           # 分组卷积设置(默认1)bias=True,          # 是否使用偏置(默认True)padding_mode='zeros' # 填充模式(默认'zeros')
)

应用场景:时序数据、文本处理、音频信号

2. nn.Conv2d - 二维卷积(最常用)

torch.nn.Conv2d(in_channels,        # 输入通道数(如RGB图像为3)out_channels,       # 输出通道数(特征图数量)kernel_size,        # 卷积核大小(整数或元组,如3或(3,3))stride=1,           # 步长(默认1)padding=0,          # 填充(默认0,可设为整数或元组)dilation=1,         # 空洞卷积(默认1)groups=1,           # 分组卷积(默认1,groups=in_channels时为深度可分离卷积)bias=True,          # 偏置项(默认True)padding_mode='zeros' # 填充模式('zeros', 'reflect', 'replicate', 'circular')
)

应用场景:图像处理、计算机视觉任务

3. nn.Conv3d - 三维卷积

torch.nn.Conv3d(in_channels,        # 输入通道数out_channels,       # 输出通道数kernel_size,        # 卷积核大小stride=1,           # 步长padding=0,          # 填充dilation=1,         # 空洞卷积groups=1,           # 分组卷积bias=True,          # 偏置padding_mode='zeros'
)

应用场景:视频处理、医学影像(3D体数据)

三、池化层

1、池化层概述

1.池化层的作用

  • 降低空间维度:减小特征图尺寸

  • 减少计算量:加速模型训练和推理

  • 增强特征鲁棒性:提供平移/旋转不变性

  • 防止过拟合:减少参数数量

  • 特征提取:保留显著特征(最大池化)或整体特征(平均池化)

2.池化层类型

类型计算方式特点适用场景
最大池化取局部区域最大值保留显著特征纹理、边缘检测
平均池化取局部区域平均值平滑特征背景特征提取
自适应池化自动调整输出尺寸固定输出大小全连接层前

2、池化层计算

最大池化:

  1. max(0, 1, 3, 4)

  2. max(1, 2, 4, 5)

  3. max(3, 4, 6, 7)

  4. max(4, 5, 7, 8)

平均池化:

  1. mean(0, 1, 3, 4)

  2. mean(1, 2, 4, 5)

  3. mean(3, 4, 6, 7)

  4. mean(4, 5, 7, 8)

3、步长

最大池化:

  1. max(0, 1, 4, 5)

  2. max(2, 3, 6, 7)

  3. max(8, 9, 12, 13)

  4. max(10, 11, 14, 15)

平均池化:

  1. mean(0, 1, 4, 5)

  2. mean(2, 3, 6, 7)

  3. mean(8, 9, 12, 13)

  4. mean(10, 11, 14, 15)

4、边缘填充

最大池化:

  1. max(0, 0, 0, 0)

  2. max(0, 0, 0, 1)

  3. max(0, 0, 1, 2)

  4. max(0, 0, 2, 0)

  5. ... 以此类推

平均池化:

  1. mean(0, 0, 0, 0)

  2. mean(0, 0, 0, 1)

  3. mean(0, 0, 1, 2)

  4. mean(0, 0, 2, 0)

  5. ... 以此类推

5、多通道池化计算

  • 每个通道独立进行池化

  • 输出通道数与输入通道数相同

输入 (3通道):
通道1: [[0,1,2], [3,4,5], [6,7,8]]
通道2: [[10,20,30], [40,50,60], [70,80,90]]
通道3: [[11,22,33], [44,55,66], [77,88,99]]
​
# 2x2 最大池化
输出:
通道1: [[4,5], [7,8]]
通道2: [[50,60], [80,90]]
通道3: [[55,66], [88,99]]

6、池化API

1. 最大池化 (MaxPooling)

torch.nn.MaxPool2d(kernel_size,    # 池化窗口大小 (int或tuple)stride=None,    # 步长 (默认为kernel_size)padding=0,      # 填充dilation=1,     # 窗口间距return_indices=False, # 是否返回最大值位置ceil_mode=False  # 尺寸计算模式 (True向上取整/False向下取整)
)

2. 平均池化 (AvgPooling)

torch.nn.AvgPool2d(kernel_size,    # 池化窗口大小stride=None,    # 步长padding=0,      # 填充ceil_mode=False, # 尺寸计算模式count_include_pad=True, # 是否包含填充值计算divisor_override=None  # 覆盖分母值
)

3. 自适应池化 (Adaptive Pooling)

# 自适应最大池化
torch.nn.AdaptiveMaxPool2d(output_size)
​
# 自适应平均池化
torch.nn.AdaptiveAvgPool2d(output_size)

示例:

import torch.nn as nn
import torch
​
#最大池化
def test01():input_map = torch.randn(1, 1, 7, 7)pool1=nn.MaxPool2d(kernel_size=2,stride=1,padding=0,ceil_mode=False)out=pool1(input_map)print(out.shape)
​
​
#平均池化
def test02():input_map = torch.randn(1, 1, 7, 7)pool1=nn.AvgPool2d(kernel_size=2,stride=1,padding=0,ceil_mode=False)out=pool1(input_map)print(out.shape)
#自适最大池化
def test03():input_map = torch.randn(1, 1, 7, 7)pool1=torch.nn.AdaptiveMaxPool2d(output_size=5)out=pool1(input_map)print(out.shape)
​
def test04():input_map = torch.randn(1, 1, 7, 7)pool1=torch.nn.AdaptiveAvgPool2d(output_size=5)out=pool1(input_map)print(out.shape)
​
if __name__ == '__main__':# test01()# test02()# test03()test04()

四、综合

自定义网络示例:

import torch
import torch.nn as nn
​
​
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.c1 = nn.Sequential(#nn.Sequential顺序执行nn.Conv2d(in_channels=1,#输入通道out_channels=16,#输出通道kernel_size=3,#卷积核stride=1,#步长),nn.ReLU(),)
​self.pool2 = nn.AdaptiveMaxPool2d(output_size=22)self.c3 = nn.Conv2d(in_channels=16,out_channels=32,kernel_size=3,stride=1,)self.pool4 = nn.AdaptiveMaxPool2d(output_size=16)
​self.l5 = nn.Linear(#全连接层  将三维特征图展平为一维向量in_features=16*16*32,out_features=10)
​def forward(self, x):# x(1,16,26,26)x = self.c1(x)# x(1,16,22,22)x = self.pool2(x)# x(1,32,20,20)x = self.c3(x)# x(1,32,16,16)x = self.pool4(x)# self.l5(x.view(-1, x.size(1)*x.size(2)*x.size(3)))out = self.l5(x.view(x.size(0), -1))return out
​
​
​
if __name__ == '__main__':input_data = torch.randn(1, 1, 28, 28)model = MyModel()out = model(input_data)print(out.shape)

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

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

相关文章

蓝桥杯---第六届省赛单片机组真题

先出手写的代码&#xff0c;代码分析还需要一段时间&#xff0c;不难&#xff0c;大家认真写。#include <STC15F2K60S2.H> #include "Seg.h" #include "LED.h" #include "Key.h" #include "DS1302.h" #include "DS18B20.h&…

GPT-5深度解析:精准、高效、务实的新一代AI引擎

&#x1f31f; GPT-5深度解析&#xff1a;精准、高效、务实的新一代AI引擎在万众瞩目中&#xff0c;OpenAI于2025年8月7日正式推出GPT-5——这一代模型没有华丽的创意革命&#xff0c;却以惊人的准确率提升、断崖式降价和强大的工程能力&#xff0c;悄然重塑了生成式AI的应用边…

oss(阿里云)前端直传

WEB端前端直传 参考文档&#xff1a;web前端直传并设置上传回调 封装oss-upload.ts // 图片上传 import { uploadToken } from /api/uploadFile.js // 获取oss token接口// 定义 OSS 信息类型 interface OssInfo {policy: string;signature: string;x_oss_credential: strin…

vscode uv 发布一个python包:编辑、调试与相对路径导包

背景 最近一直在使用uv做python包管理&#xff0c;用起来很方便。 尤其是在代码上传到github的时候&#xff0c;pyproject.toml 会显示出当前项目依赖的python包。这样在把代码下载到本地之后&#xff0c;直接uv sync就可以很方便地恢复出python环境。 uv 除了有上述优点&…

Secure 第四天作业

实验需求&#xff1a;需求一拓扑&#xff1a;按照以上拓扑所示&#xff0c;完成以下需求&#xff1a;参考以上拓扑&#xff0c;配置设备IP地址&#xff0c;使用UNL里Secure第四天拓扑即可。&#xff08;有兴趣的同学课后也可按照PPT原拓扑做做实验&#xff09;&#xff1b;配置…

利用开漏输出模式模拟IIC

/************************************************************利用IO口模拟IIC时序&#xff0c;需要使用2个IO口(SDA和SCL)SCL时钟线只能由主器件进行控制&#xff0c;所以SCL引脚必须为输出模式SDA数据线&#xff0c;在主器件发送数据时&#xff0c;SDA引脚为输出模式SDA数…

闸机控制系统从设计到实现全解析:第 5 篇:RabbitMQ 消息队列与闸机通信设计

第 5 篇&#xff1a;RabbitMQ 消息队列与闸机通信设计RabbitMQ 是一款开源的消息队列中间件&#xff08;Message Queue&#xff0c;MQ&#xff09;&#xff0c;基于 Erlang 语言开发&#xff0c;遵循 AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高级消息队…

Linux 常用命令大全:覆盖日常 99% 操作需求

1、基本命令 pwd&#xff1a;显示当前工作目录的绝对路径&#xff0c;例如在复杂目录结构中快速确认位置&#xff0c;执行后会输出类似/home/user/documents的结果。 cd&#xff1a;切换目录&#xff0c;cd 目录路径可进入指定目录&#xff0c;cd ~回到当前用户的家目录&…

普通电脑与云电脑的区别有哪些?全面科普

近年来&#xff0c;越来越多的人不再购置升级自己的电脑&#xff0c;转而选择云电脑&#xff0c;云端产品正在变得越来越普及易用。那么它究竟跟我们的普通本地设备有什么区别呐&#xff1f;或许很多人并不知悉&#xff0c;对此&#xff0c;本篇内容小编就为大家简要科普一下普…

【Python】支持向量机SVM

示例代码&#xff1a;import numpy as np import matplotlib.pyplot as plt from sklearn import svm from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report# 设…

当AI学会“抄近路”:残差网络如何突破深度学习的极限

**——解读《Deep Residual Learning for Image Recognition》**今天我想带大家回到2015年&#xff0c;见证人工智能领域的一场“捷径革命”——由何恺明等人提出的**深度残差学习框架&#xff08;ResNet&#xff09;**。这篇论文解决了困扰AI界多年的“深度诅咒”&#xff0c;…

HCIP--BGP综合实验

目录 BGP综合实验报告 一、实验拓扑 二、实验要求 三、实验思路 &#xff08;一&#xff09;IP地址规划 &#xff08;二&#xff09;整体思路 四、实验步骤 &#xff08;一&#xff09; IP地址配置 &#xff08;二&#xff09; AS2内部配置OSPF协议 &#xff08;三&a…

Java 基础编程案例:从输入交互到逻辑处理

在Java编程学习中&#xff0c;输入输出、循环控制和逻辑判断是核心基础。本文整理了10个经典案例&#xff0c;涵盖Scanner输入处理、斐波那契数列、成绩统计、登录验证等场景&#xff0c;帮助初学者掌握编程逻辑与实用技巧。 一、Scanner输入交互&#xff1a;获取用户输入并处理…

LeetCode 面试经典 150_数组/字符串_整数转罗马数字(18_12_C++_中等)(模拟)(对各位进行拆解)

LeetCode 面试经典 150_数组/字符串_整数转罗马数字&#xff08;18_12_C_中等&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;模拟&#xff09;&#xff1a;思路二&#xff08;对各位进行拆解&#xff09;&a…

计算机网络摘星题库800题笔记 第6章 应用层

第6章 应用层 6.1 网络应用的架构 考点 1 CS 架构 题组闯关 1.DNS 是基于 ( ) 模式的分布式系统。 A. C/S B. B/S C. P2P D. 以上均不正确 1.【参考答案】A 【解析】本题考查网络应用模型。 DNS 作为分布式应用&#xff0c;是一种典型的 C/S 模式&#xff0c;是随着 Internet 技…

BLUCK电路的输入电容应该怎么选取

借用TI的BULK芯片讨论一下输入电容怎么选取的问题&#xff0c;BULK电源是我们常用的电源&#xff0c;它的原理请看之前的文章&#xff1a; 高压差为何不用LDO&#xff1f;DCDC效率更高&#xff01;-CSDN博客 本文我们探讨一下输入电容&#xff0c;输入电容是控制纹波的关键&a…

CAN仲裁机制的原理

我们来详细讲 CAN 仲裁机制 的原理和工作方式,这是 CAN 总线最核心的特性之一。 1️⃣ 基本概念 CAN 总线是 多主机、多节点的串行总线,所有节点共享一根差分信号线(CAN_H / CAN_L)。 每个节点都可以随时发送消息(多主机机制) 总线只能同时有一个节点成功发送 仲裁 用…

【GPT入门】第46课 vllm安装、部署与使用

【GPT入门】第46课 vllm安装、部署与使用 1.准备服务器 2. 安装 conda环境,隔离base环境 3. vllm使用 3.1 在线推理, openai兼容服务器 3.2 模型离线调用 4. 没有使用GPU问题分析 1.准备服务器 cuda 版本选12.1 vllm官网介绍: https://vllm.hyper.ai/docs/getting-started/…

【从网络基础到实战】理解TCP/IP协议体系的核心要点(包含ARP协议等其他协议介绍)

前言&#xff1a; 学习计算机网络不仅是软件开发的基础功&#xff0c;更是成为一名合格后端工程师、网络工程师的重要门槛。本文将基于 TCP/IP 协议体系&#xff0c;系统梳理网络层、数据链路层、以及相关协议的核心知识&#xff0c;并结合实际案例与代码示例帮助理解。一、网络…

Python 元类基础:从理解到应用的深度解析

在 Python 的高级编程中&#xff0c;元类&#xff08;metaclass&#xff09; 无疑是最神秘又最强大的特性之一。它不仅是构建类的“工厂”&#xff0c;更是 Python 灵活对象模型的体现。本文将带你从基础概念入手&#xff0c;深入理解元类的本质、工作机制以及实际应用&#xf…