神经网络——卷积层

目录

卷积层介绍

Conv2d

卷积动画演示

卷积代码演示 

综合代码案例


卷积层介绍

卷积层是卷积神经网络(CNN)的核心组件,它通过卷积运算提取输入数据的特征

基本原理

卷积层通过卷积核(过滤器)在输入数据(如图像)上滑动,进行逐元素乘法并求和,从而提取局部特征。每个卷积核学习不同的特征(如边缘、纹理),最终生成多个特征图

  • 局部连接:卷积核只关注输入的局部区域,减少参数数量。

  • 权值共享:同一个卷积核在整个输入上滑动,降低过拟合风险。

  • 特征提取:不同卷积核可以检测不同特征,如水平边缘、垂直边缘等。

核心参数

  • 卷积核大小:通常为 3x3、5x5 等,决定感受野。

  • 步长(Stride):卷积核滑动的步距,影响输出尺寸。

  • 填充(Padding):在输入周围添加零值,控制输出尺寸与输入一致。

  • 卷积核数量:决定输出特征图的通道数。

 


 

Conv2d

Conv2d:二维卷积操作

相关参数如下: 

参数:

  • in_channels (int) – 输入图像中的通道数

  • out_channels (int) – 卷积产生的通道数

  • kernel_size (int 或 tuple) – 卷积核的大小

  • stride (int 或 tuple可选的) – 卷积的步长。默认值:1

  • padding (inttuple 或 str可选的) – 输入四边添加的填充。默认值:0

  • dilation (int 或 tuple可选的) – 内核元素之间的间距。默认值:1

  • groups (int可选的) – 从输入通道到输出通道的组连接数。默认值:1

  • bias (bool可选的) – 如果为 True,则向输出添加一个可学习的偏置项。默认值:True

  • padding_mode (str可选的) – 'zeros''reflect''replicate' 或 'circular'。默认值:'zeros'

 


 

卷积动画演示

注意:蓝色映射是输入,青色映射是输出。

       No padding, no strides                       Arbitrary padding, no strides

      没有填充,没有步幅                           任意填充,无步幅

          Half padding, no strides                Full padding, no strides

         半填充,无步幅                                全填充,无步幅

        No padding, strides                             Padding, strides

         没有填充,没有步幅                                 填充、步幅

 

     Padding, strides (odd)

     填充、步幅(奇数)


 

卷积代码演示 

import torch
import torch.nn.functional as Finput = 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]
])print(input.shape)
print(kernel.shape)
"""
打印结果:
torch.Size([5, 5])
torch.Size([3, 3])
不符合卷积层的输入要求
在最简单的情况下,输入尺寸为 (N,C,H,W)
N:批量数
C:通道数
H:高度
W:宽度
"""# 尺寸变换
input = torch.reshape(input, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))
print(input.shape)
print(kernel.shape)
"""
打印结果:
torch.Size([1, 1, 5, 5])
torch.Size([1, 1, 3, 3])
"""output = F.conv2d(input, kernel, stride=1)
print(output)
"""
打印结果:
tensor([[[[10, 12, 12],[18, 16, 16],[13,  9,  3]]]])
"""
# stride为2时
output2 = F.conv2d(input, kernel, stride=2)
print(output2)
"""
打印结果:
tensor([[[[10, 12],[13,  3]]]])
"""

卷积操作分析: 


当设置了padding时候 ,输入的量得到了填充 默认填充为0

进行卷积操作的时候,还是从左上角开始 

# 设置padding
output3=F.conv2d(input,kernel,stride=1,padding=1)
print(output3)
"""
打印结果:
tensor([[[[ 1,  3,  4, 10,  8],[ 5, 10, 12, 12,  6],[ 7, 18, 16, 16,  8],[11, 13,  9,  3,  4],[14, 13,  9,  7,  4]]]])
"""

 

综合代码案例

 

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdataset = torchvision.datasets.CIFAR10("../torchvision_dataset", train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset, batch_size=64)class MyModel(nn.Module):def __init__(self):super().__init__()self.conv1 = Conv2d(3, 6, 3, stride=1, padding=0)def forward(self, x):x = self.conv1(x)return xmodule1 = MyModel()
step = 0
writer = SummaryWriter("logs_test3")
for data in dataloader:imgs, target = dataoutput = module1(imgs)print("卷积前", imgs.shape)print("卷积后", output.shape)# 卷积前 torch.Size([64, 3, 32, 32])writer.add_images("input", imgs, step)# 卷积后 torch.Size([64, 6, 30, 30])# 直接用会报错 因为6通道不好显示# 一个不严谨的方法:reshape为3通道# [64, 6, 30, 30]->[***, 3, 30, 30]output = torch.reshape(output, (-1, 3, 30, 30))  # 参数为-1时,会根据后面的自己计算writer.add_images("output", output, step)step += 1

 

 在卷积操作中,输出通道数由卷积核的数量决定

每个输出通道由一个卷积核扫描 3 个输入通道后求和

输入: 32×32×3(3通道)┌───────────┐    ┌───────────┐    ┌───────────┐│  红通道   │    │  绿通道   │    │  蓝通道   ││ 32×32×1   │    │ 32×32×1   │    │ 32×32×1   │└───────────┘    └───────────┘    └───────────┘│                 │                 │└────────┬────────┴────────┬────────┘│                 │6个3×3×3卷积核          ││                 │┌────────┴─────────────────┘▼
输出: 30×30×6(6通道)┌───────────┐    ┌───────────┐    ┌───────────┐│ 特征图1   │    │ 特征图2   │    │ 特征图3   ││ 30×30×1   │    │ 30×30×1   │    │ 30×30×1   │└───────────┘    └───────────┘    └───────────┘│                 │                 │┌───────────┐    ┌───────────┐    ┌───────────┐│ 特征图4   │    │ 特征图5   │    │ 特征图6   ││ 30×30×1   │    │ 30×30×1   │    │ 30×30×1   │└───────────┘    └───────────┘    └───────────┘

 3*3*3卷积核的理解:

不是3个一样的3*3的子核(每一个子核也不一样),也不是3个卷积核

一个完整的卷积核是包含所有输入通道对应子核的集合,而不是单个通道的子核。

输出第 1 个通道的特征图,就是由 “第 1 个完整卷积核”(包含 3 个子核)分别对 RGB 三个通道计算后相加得到的。

“卷积核” 指的是对应 1 个输出通道的整体结构(3×3×3),而子核只是其内部组成部分。就像 “1 辆汽车由 4 个轮子组成,但我们说‘1 辆车’而不是‘4 个轮子’”—— 这里的逻辑是一致的。


调用前后图片尺寸发生变化

 

图像尺寸从 32×32 变为 30×30 是由卷积操作的数学特性决定的。因为使用了3×3 的卷积核且没有添加填充(padding=0),导致边缘像素无法被卷积核完全覆盖。 

计算输出尺寸的公式: 

输出尺寸 = 向下取整[(输入尺寸 - 卷积核大小 + 2×填充) ÷ 步长] + 1

官方公式:

 

 


 

为什么需要多个输出通道?

卷积神经网络的核心思想是用多个卷积核提取不同的特征。每个输出通道对应一个独特的卷积核,它会学习检测特定的模式(如边缘、纹理、颜色等)。

例如:

  • 第 1 个卷积核可能学会检测水平边缘。

  • 第 2 个卷积核可能学会检测垂直边缘。

  • 第 3-6 个卷积核可能学会检测更复杂的纹理或颜色模式。

 

 

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

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

相关文章

神经网络——线性层

在机器学习中,线性层(Linear Layer) 是一种基础的神经网络组件,也称为全连接层(Fully Connected Layer) 或密集层(Dense Layer)。 其严格的数学定义为:对输入数据执行线…

大模型高效适配:软提示调优 Prompt Tuning

The Power of Scale for Parameter-Efficient Prompt Tuning ruatishi 软提示向量 具体是什么 《The Power of Scale for Parameter-Efficient Prompt Tuning》中增加的部分是“软提示(soft prompts)”,这是一种针对特定下游任务,添加到输入文本中的可调参数序列。它与传统…

https正向代理 GoProxy

背景: 在安全隔离的内网环境中,部署于内网的应用如需调用公网第三方接口(如支付、短信),可通过正向代理服务实现访问。 GoProxy 下载: https://github.com/snail007/goproxy/releases 使用文档&#xff…

Java IO流体系详解:字节流、字符流与NIO/BIO对比及文件拷贝实践

一、字节流与字符流:如何选择? 1.1 核心区别特性字节流字符流处理单位字节(8位)字符(16位Unicode)适用场景二进制文件(图片/视频)文本文件(TXT/CSV)编码处理需…

QT6 源,七章对话框与多窗体(5) 文件对话框 QFileDialog 篇二:源码带注释

&#xff08;13&#xff09;本源代码定义于头文件 qfiledialog . h &#xff1a; #ifndef QFILEDIALOG_H #define QFILEDIALOG_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtCore/qdir.h> #include <QtCore/qstring.h> #include <QtCore/qurl.h…

关于Ajax的学习笔记

Ajax概念&#xff1a;是一门使用了js语言&#xff0c;可以使用于Javaweb&#xff0c;实现前端代码和后端代码连结的的一种异步同步&#xff08;不需要等待服务器相应&#xff0c;就能够发送第二次请求&#xff09;的一种技术&#xff0c;它主要用于网页内容的局部刷新&#xff…

The Missing Semester of Your CS Education 学习笔记以及一些拓展知识(三)

文章目录The Missing Semester of Your CS Education 学习笔记以及一些拓展知识Vim编辑器笔记部分程序员常用的编辑器Vim的模式Vim的普通模式Vim的插入模式Vim的可视模式Vim的替换模式Vim的命令行模式Vim的高级功能文本对象宏寄存器缓冲区标记代码折叠Vim的常用配置Vim的常用插…

PyTorch常用的简单数学运算

一、基础算术运算1. 逐元素运算a torch.tensor([1, 2, 3]) b torch.tensor([4, 5, 6])# 加减乘除 a b # [5, 7, 9] a - b # [-3, -3, -3] a * b # [4, 10, 18] a / b # [0.25, 0.4, 0.5]# 幂运算、平方根 a ** 2 # [1, 4, 9] torch.sqrt(a) # [1.0, 1.414, 1.732]2. 标…

C++ Lambda 表达式详解:从基础到实战

Lambda 表达式是 C11 引入的重要特性&#xff0c;它允许我们在代码中定义匿名函数&#xff0c;极大地简化了代码编写&#xff0c;尤其是在使用 STL 算法和多线程编程时。本文将详细介绍 Lambda 表达式的语法、特性及实际应用场景。什么是 Lambda 表达式&#xff1f;Lambda 表达…

Spring Boot注解详解

文章目录前言1. 核心启动注解SpringBootApplicationEnableAutoConfigurationSpringBootConfiguration2. 组件注解Component及其衍生注解ComponentServiceRepositoryControllerRestController3. 依赖注入注解AutowiredQualifierPrimary4. Web相关注解请求映射注解RequestMapping…

Web开发:ABP框架12——中间件Middleware的创建和使用

一、简介中间件可以用于鉴权、日志&#xff0c;拦截器可以用于指定方法或url的业务逻辑处理&#xff0c;两者分工不同&#xff0c;实现效果相似&#xff0c;先执行中间件&#xff0c;后执行拦截器&#xff0c;再到WebAPI接口。二、示例一个Token验证中间件三、代码1.Startup.cs…

京东商品评论如何获取?API接口实战指南

一、API接入准备1. 注册开发者账号访问京东开放平台&#xff1a;前往京东开放平台注册账号&#xff0c;完成企业或个人实名认证。创建应用&#xff1a;在控制台创建应用&#xff0c;获取App Key和App Secret&#xff08;用于签名认证&#xff09;。2. 申请API权限搜索接口&…

leetcode-sql-627变更性别

题目&#xff1a; Salary 表&#xff1a; --------------------- | Column Name | Type | --------------------- | id | int | | name | varchar | | sex | ENUM | | salary | int | --------------------- id 是这个表的主键…

【学习路线】C#企业级开发之路:从基础语法到云原生应用

一、C#基础入门&#xff08;1-2个月&#xff09; &#xff08;一&#xff09;开发环境搭建Visual Studio安装配置 Visual Studio Community&#xff1a;免费版本&#xff0c;功能完整Visual Studio Code&#xff1a;轻量级&#xff0c;跨平台支持JetBrains Rider&#xff1a;专…

Planning Agent:基于大模型的动态规划与ReAct机制,实现复杂问题自适应执行求解

引言 在当今数据驱动的商业环境中&#xff0c;企业面临着日益复杂的决策问题。传统的数据分析工具往往难以应对多步骤、多依赖的复杂问题求解。例如&#xff0c;当企业需要分析"北美市场 Q1-Q2 主要产品的销售增长趋势并识别关键驱动因素"时&#xff0c;传统工具可能…

人该怎样活着呢?55

人该怎样活着呢&#xff1f; A思考现实问题并记录自己的灵感 。【生活的指南针】 &#xff08;20250212&#xff09; a1如何思考&#xff1f; 当有人问他用什么方法得到那么多发现时&#xff0c;牛顿说&#xff1a;“我只不过对于一件事情&#xff0c;总是花很长时间很热…

rtthread - V5.1.0版本 HOOK 钩子函数总结

rtthread - V5.1.0版本 钩子函数 相对于V4.0.3版本做了很大的修改和优化&#xff1a;旧版本 V4.0.3&#xff1a;rt_thread_inited_sethook(thread_inited_hook);rt_thread_deleted_sethook(thread_deleted_hook);rt_scheduler_sethook(scheduler_hook);新版本 V5.1.0&#xff1…

Python特性:装饰器解决数据库长时间断连问题

前言 在基于 Python 的 Web 应用开发里&#xff0c;数据库连接是极为关键的一环。不过&#xff0c;像网络波动、数据库服务器维护这类因素&#xff0c;都可能造成数据库长时间断连&#xff0c;进而影响应用的正常运作。本文将详细介绍怎样运用 retry_on_failure 装饰器来解决数…

疗愈之手的智慧觉醒:Deepoc具身智能如何重塑按摩机器人的触觉神经

疗愈之手的智慧觉醒&#xff1a;Deepoc具身智能如何重塑按摩机器人的触觉神经康复中心的理疗室内&#xff0c;一位运动员正俯卧在治疗床上。机械臂的硅胶触头沿腰背肌群缓缓移动&#xff0c;当传感器捕捉到竖脊肌的异常僵直时&#xff0c;触头自动切换高频震颤模式&#xff1b;…

webpack将组件vue进行编译混淆,并能正常使用编译之后的文件

介绍: 我们在开发的过程中有很多组件都需要复用,特别是我们耗费了好几天时间写出来的组件,比如自己写的表格组件,流程图组件等。总之都是自己不断测试,不断编写耗费了大把的精力写的。直接用到自己的项目中倒是无所谓,如果是把自己写的组件给别人,这里就涉及到自己的劳动…