一篇文章弄懂卷积神经网络基础概念

news2025/1/12 21:04:33

文章目录

  • 一篇文章弄懂卷积神经网络基础概念
    • 下采样和上采样
    • 卷积
      • 普通卷积
      • 空洞卷积
      • 转置卷积
      • 膨胀卷积和转置卷积的区别
    • 池化
      • 最大池化
      • 平均池化
    • 全连接

一篇文章弄懂卷积神经网络基础概念

卷积神经网络可以说是图像处理的天花板,也是当下图像处理在深度学习方面最热门的研究。接下来,从卷积核、池化、全连接等方面介绍卷积神经网络中的关键操作。

下采样和上采样

  • 下采样即由输入图像中提取特征。其中有两个作用,一是减少计算量,防止过拟合;二是增大感受野,使得后面的卷积核能够学到更加全局的信息。下采样常用的方式有两种:采用stride为2的池化层和采用stride为2的卷积层(下采样的过程是一个信息损失的过程)。
  • 上采样即将图像恢复到原来的尺寸(使图像由小分辨率映射到大分辨率)。其目的是为了进一步计算(图像补全、图像的语义分割),上采样常用的方式有三种:插值法、转置卷积以及Up-Pooling。

该文章中下采样主要为卷积(普通卷积、空洞卷积、池化)而上采样主要为转置卷积。

卷积

卷积操作的作用是提取图像中的局部信息。卷积核的大小通常比输入数据小,因此每次卷积计算得到的是输入数据的一个小的局部区域的特征。通过不同大小的卷积核和不同的卷积核数量,可以提取出不同尺度和不同方向的特征。
在这里插入图片描述

普通卷积

import torch
import torch.nn as nn
# 定义输入
input_data = torch.tensor([[[
                             [0.1 ,0.2,0.3,0.1,0.1,0.5],
                             [0.2,0.1,0.2,0.3,0.1,0.1],
                             [0.2,0.1,0.2,0.3,0.1,0.1],
                             [0.2,0.1,0.2,0.3,0.1,0.1],
                             [0.2,0.1,0.2,0.3,0.1,0.1],
                             [0.2,0.1,0.2,0.3,0.1,0.1]
                            ]]])
print(input_data)# 查看自定义张量input_data
# 定义标准卷积层
conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, stride=1, padding=0)
print(conv.state_dict())# 返回一个字典,其中包含了模型的所有参数
# 进行普通卷积操作
conv_result = conv(input_data)
print('Convolution result shape:', conv_result.shape)# 查看卷积操作后的形态
print('Convolution result:', conv_result)# 查看卷积操作后的结果

输出结果

tensor([[[[0.1000, 0.2000, 0.3000, 0.1000, 0.1000, 0.5000],
          [0.2000, 0.1000, 0.2000, 0.3000, 0.1000, 0.1000],
          [0.2000, 0.1000, 0.2000, 0.3000, 0.1000, 0.1000],
          [0.2000, 0.1000, 0.2000, 0.3000, 0.1000, 0.1000],
          [0.2000, 0.1000, 0.2000, 0.3000, 0.1000, 0.1000],
          [0.2000, 0.1000, 0.2000, 0.3000, 0.1000, 0.1000]]]])
OrderedDict([('weight', tensor([[[[-0.3229,  0.2283,  0.2123],
          [ 0.1449, -0.1590,  0.1524],
          [-0.2071, -0.0818,  0.2543]]]])), ('bias', tensor([-0.1603]))])
Convolution result shape: torch.Size([1, 1, 4, 4])
Convolution result: tensor([[[[-0.0384, -0.0675, -0.2571, -0.0657],
          [-0.1148, -0.0156, -0.1792, -0.2152],
          [-0.1148, -0.0156, -0.1792, -0.2152],
          [-0.1148, -0.0156, -0.1792, -0.2152]]]],
       grad_fn=<ConvolutionBackward0>)

空洞卷积

空洞卷积是卷积神经网络中的一种卷积方式,它的作用主要有以下几个方面:

  1. 扩大感受野:在传统卷积操作中,每个卷积核只能获取相邻的像素信息。而空洞卷积通过在卷积核内部增加跳跃的间隔(即空洞大小),可以让卷积核获取更远的像素信息,从而扩大感受野,提高图像识别的准确率。
  2. 减少参数量:在传统卷积操作中,每个卷积核的参数量取决于卷积核大小和通道数。而空洞卷积通过增加卷积核的空洞大小,可以在不增加参数量的情况下扩大感受野。
  3. 保持分辨率:在传统的卷积操作中,通过池化操作可以降低特征图的分辨率,从而减少计算量。而空洞卷积可以在不降低分辨率的情况下扩大感受野,从而保持特征图的分辨率。
  4. 改善边缘信息:在传统卷积操作中,由于卷积核只能获取相邻的像素信息,因此对于边缘信息的提取效果不佳。而空洞卷积通过扩大感受野,可以获取更远的像素信息,从而改善边缘信息的提取效果。

在这里插入图片描述

import torch
import torch.nn as nn
# 定义输入
input_data = torch.tensor([[[
                             [0.1 ,0.2,0.3,0.1,0.1,0.5],
                             [0.2,0.1,0.2,0.3,0.1,0.1],
                             [0.2,0.1,0.2,0.3,0.1,0.1],
                             [0.2,0.1,0.2,0.3,0.1,0.1],
                             [0.2,0.1,0.2,0.3,0.1,0.1],
                             [0.2,0.1,0.2,0.3,0.1,0.1]
                            ]]])
print(input_data)
# 定义标准卷积层和空洞卷积层
conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, stride=1, padding=0)
print(conv.state_dict())
# 空洞卷积输出结果
dilated_conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, stride=1, padding=2, dilation=2)
print(dilated_conv.state_dict())# 返回一个字典,其中包含了模型的所有参数
dilated_conv_result = dilated_conv(input_data)
print('Dilated convolution result shape:', dilated_conv_result.shape)# 查看卷积操作后的形态
print('Dilated convolution result:', dilated_conv_result)

输出结果


tensor([[[[0.1000, 0.2000, 0.3000, 0.1000, 0.1000, 0.5000],
          [0.2000, 0.1000, 0.2000, 0.3000, 0.1000, 0.1000],
          [0.2000, 0.1000, 0.2000, 0.3000, 0.1000, 0.1000],
          [0.2000, 0.1000, 0.2000, 0.3000, 0.1000, 0.1000],
          [0.2000, 0.1000, 0.2000, 0.3000, 0.1000, 0.1000],
          [0.2000, 0.1000, 0.2000, 0.3000, 0.1000, 0.1000]]]])
OrderedDict([('weight', tensor([[[[ 0.0818,  0.1001, -0.1972],
          [-0.0940, -0.2605,  0.1210],
          [ 0.1136,  0.2079,  0.0602]]]])), ('bias', tensor([-0.0697]))])
OrderedDict([('weight', tensor([[[[-0.2004, -0.2327, -0.1165],
          [-0.0940,  0.0574, -0.0417],
          [-0.0378, -0.2901,  0.3276]]]])), ('bias', tensor([0.3039]))])
Dilated convolution result shape: torch.Size([1, 1, 6, 6])
Dilated convolution result: tensor([[[[0.3047, 0.3805, 0.2748, 0.2120, 0.2449, 0.2829],
          [0.3146, 0.3664, 0.2596, 0.2495, 0.2543, 0.2411],
          [0.2563, 0.3082, 0.1581, 0.1279, 0.1709, 0.1047],
          [0.2447, 0.3082, 0.1613, 0.1480, 0.1909, 0.1577],
          [0.2372, 0.2389, 0.1941, 0.2060, 0.2275, 0.1980],
          [0.2372, 0.2389, 0.1941, 0.2060, 0.2275, 0.1980]]]],
       grad_fn=<ConvolutionBackward0>)

转置卷积

反卷积(Deconvolution)操作是卷积神经网络(CNN)中的一种常见操作,也称为转置卷积[2](Transposed Convolution)或分数步长卷积(Fractionally Strided Convolution)。在CNN中,卷积操作常用于提取输入图像的特征,反卷积操作则用于将特征图还原为原始图像或进行像素级别的分割。
在这里插入图片描述

import torch
import torch.nn as nn
# 定义输入和卷积核
t = torch.tensor([[
                   [ 0.1 , 0.2 ],
                   [ 0.2 , 0.1 ]]
                 ])
print(type(t),t)
# in_channels表示输入通道数,out_channels表示输出通道数,kernel_size表示卷积核大小
conv_transpose = nn.ConvTranspose2d(in_channels=1, out_channels=1, kernel_size=2, stride=1)
print(conv_transpose.state_dict())# 返回一个字典,其中包含了模型的所有参数
# 输出结果
conv_transpose_result = conv_transpose(t)
print('conv_transpose_result:', conv_transpose_result)

输出结果

<class 'torch.Tensor'> tensor([[[0.1000, 0.2000],
         [0.2000, 0.1000]]])
OrderedDict([('weight', tensor([[[[ 0.1511, -0.4327],
          [ 0.2216,  0.0240]]]])), ('bias', tensor([-0.4246]))])
tensor([[[-0.4095, -0.4377, -0.5112],
         [-0.3722, -0.4493, -0.4631],
         [-0.3803, -0.3976, -0.4222]]], grad_fn=<SqueezeBackward1>)

膨胀卷积和转置卷积的区别

转置卷积和膨胀卷积是两个不同的概念,它们之间的作用和区别如下所述:

  1. 转置卷积是一种反卷积操作,也称为反卷积或上采样(upsampling)操作。它的作用是将输入张量的大小扩大,通常用于图像分割、语义分割、图像生成等任务中。转置卷积的核函数可以看作是卷积核的转置,可以通过反向卷积来实现。在转置卷积中,卷积核的大小和步长是可调的,通过调整这些参数可以控制输出的大小和形状。
  2. 膨胀卷积是一种空洞卷积(dilated convolution)操作,它的作用是在不增加模型参数和计算量的情况下增加卷积层的感受野(receptive field)。膨胀卷积通过在卷积核中间插入一些空洞(dilation)来实现,这些空洞可以增加卷积核的有效大小。在膨胀卷积中,卷积核的大小和步长是固定的,但通过调整膨胀率可以控制卷积核的感受野。
  3. 两者的区别 转置卷积和膨胀卷积都是卷积神经网络中常用的操作,但它们的作用和使用场景是不同的。转置卷积用于对输入张量进行上采样操作,通常用于图像分割、图像生成等任务中。而膨胀卷积用于增加卷积层的感受野,可以提高模型对图像中局部特征的识别能力,通常用于语义分割、物体检测等任务中。此外,转置卷积的核函数大小和步长是可调的,而膨胀卷积的核函数大小和步长是固定的,但可以通过调整膨胀率来控制卷积核的感受野。

感受野:指卷积神经网络中每个输出特征图的每个像素点对应输入图像的区域大小。

池化

池化操作(Pooling)其主要作用是在卷积层之间减少特征图的维度,从而减少模型的参数数量和计算量,避免过拟合。常见的池化操作有最大池化(Max Pooling)和平均池化(Average Pooling)两种。

最大池化

最大池化计算简单而且能够更好的保留纹理特征,得到的图像颜色更亮。

import torch
import torch.nn as nn
# 创建一个最大池化层,池化窗口大小为3x3,步长为1
pool = nn.MaxPool2d(kernel_size=3, stride=1)
print(pool)
# 创建一个输入张量,大小为(1, 1, 4, 4)
x = torch.Tensor([[[
                    [ 1,  2,  3,  4], 
                    [ 5,  6,  7,  8], 
                    [ 9, 10, 11, 12], 
                    [13, 14, 15, 16]
                ]]])
# 将输入张量传递给池化层,并计算输出
output = pool(x)
# 打印输出张量
print(output)

输出结果

MaxPool2d(kernel_size=3, stride=1, padding=0, dilation=1, ceil_mode=False)
tensor([[[[11., 12.],
          [15., 16.]]]])

平均池化

import torch
import torch.nn as nn
# 创建一个最大池化层,池化窗口大小为3x3,步长为1
pool = nn.AvgPool2d(kernel_size=3, stride=1)
print(pool)
# 创建一个输入张量,大小为(1, 1, 4, 4)
x = torch.Tensor([[[
                    [ 1,  2,  3,  4], 
                    [ 5,  6,  7,  8], 
                    [ 9, 10, 11, 12], 
                    [13, 14, 15, 16]
                ]]])
# 将输入张量传递给池化层,并计算输出
output = pool(x)
# 打印输出张量
print(output)

输出结果

AvgPool2d(kernel_size=3, stride=1, padding=0)
tensor([[[[ 6.,  7.],
          [10., 11.]]]])

注:池化层是不可学习的,用stride为2的可学习卷积层来代替pooling可以得到更好的效果,当然同时也增加了一定的计算量。

全连接

全连接层(Fully Connected Layer)是卷积神经网络中的一种常用层,通常位于卷积层和输出层之间。全连接层的作用是将经过卷积层和池化层处理后的特征图进行展平(Flatten),然后连接一个或多个全连接层进行分类或回归。

import torch
import torch.nn as nn
# 创建一个全连接层,输入维度为4,输出维度为2
fc = nn.Linear(4, 2)
print(fc.state_dict())# 返回一个字典,其中包含了模型的所有参数
# 创建一个输入张量,大小为(1, 4)
x = torch.tensor([0.1,0.2,0.2,0.1])
# 将输入张量传递给全连接层,并计算输出
output = fc(x)
# 打印输出张量
print(output)# 第一个:-0.4654×0.1+0.0059 ×0.2+ 0.2813×0.2+0.1×(-0.2186)-0.3949 = -0.40586

输出结果

OrderedDict([('weight', tensor([[-0.4654,  0.0059,  0.2813, -0.2186],
        [ 0.4194,  0.0747,  0.2652,  0.0923]])), ('bias', tensor([-0.3949, -0.1806]))])
tensor([-0.4059, -0.0615], grad_fn=<AddBackward0>)

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

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

相关文章

2023/5/23总结

super关键字 super关键字的用法和this 关键字的用法相似 this:代表本类对象的引用&#xff08;this关键字指向调用该方法的对象一般我们是在当前类中使用this关键字&#xff0c;所以我们常说this代表本类对象的引用&#xff09;super:代表父类存储空间的标识(可以理解为父类对象…

AGV/AMR控制器--仙工

AGV/AMR控制器--仙工 1 行业介绍1.1 控制器概念1.2 行业发展1.3 竞争格局 2 仙工控制器 SRC2.1 介绍2.2 优势标准化软硬件&#xff0c;适配多种运动模型超强适配性&#xff0c;适配各大品牌支持车型多样&#xff0c;应对场景复杂灵活应对非标需求 2.3 产品矩阵2.4 实施工具Robo…

CLIP使用教程

文章目录 前言注意使用其他示例 原理篇 前言 本文主要介绍如何调用Hugging Face中openai提供的CLIP API. 注意 如果碰到模型无法自动下载&#xff0c;可手动下载到本地&#xff0c;注意本地调用路径后缀加/。 下载config.json、preprocessor_config.json、pytorch_model.bi…

热乎的过万字GameFramework讲解笔记文档

往期文章分享 点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 本文约15千字&#xff0c;新手阅读需要27分钟&#xff0c;复习需要12分钟 【收藏随时查阅不再迷路】 &#x1f449;关于作者 众所周知&a…

YOLOv5改进系列(5)——替换主干网络之 MobileNetV3

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制 YOLOv5改进系列(2&#

【数据结构与算法篇】栈与队列(详解)附加Leetcode经典笔试题

​&#x1f47b;内容专栏&#xff1a;《数据结构与算法专栏》 &#x1f428;本文概括&#xff1a; 讲述数据结构栈与队列基本知识。 &#x1f43c;本文作者&#xff1a;花 碟 &#x1f438;发布时间&#xff1a;2023.5.23 文章目录 一、栈1.栈的概念及结构2.栈的实现 二、有效的…

C++中的函数模板

目录 1. 什么是函数模板&#xff1f; 2. 如何定义函数模板&#xff1f; 3. 如何使用函数模板&#xff1f; 4. 函数模板与函数重载的区别是什么&#xff1f; 5. 函数模板与类模板有何异同点&#xff1f; 1. 什么是函数模板&#xff1f; - 函数模板是一种通用的函数描述&…

STM32的SPI外设

文章目录 1. STM32 的 SPI 外设简介2. STM32 的 SPI 架构剖析2.1 通讯引脚2.2 时钟控制逻辑2.3 数据控制逻辑2.4 整体控制逻辑 3. 通讯过程4. SPI 初始化结构体详解 1. STM32 的 SPI 外设简介 STM32 的 SPI 外设可用作通讯的主机及从机&#xff0c;支持最高的 SCK 时钟频率为 …

语义分割实战项目(从原理到代码环境配置)

MMsegmentation是一个基于PyTorch的图像分割工具库,它提供了多种分割算法的实现,包括语义分割、实例分割、轮廓分割等。MMsegmentation的目标是提供一个易于使用、高效、灵活且可扩展的平台,以便开发者可以轻松地使用最先进的分割算法进行研究和开发。 看下结果 MMsegmenta…

安卓基础巩固(三)多线程、IO操作、数据存储

文章目录 多线程Handler相关概念UI线程/主线程MessageMessage QueueLooperHandler 使用步骤Handler.sendMessage&#xff08;&#xff09;Handler.post&#xff08;&#xff09; Handler 机制工作原理Handler内存泄露前置知识案例分析解决方案一&#xff1a;静态内部类弱引用解…

day09 MyBatis基础操作

为什么使用框架 框架的作用:可以直接调用写好的API,提高开发效率,框架是一种经过校验,有一定功能的半成品软件 为什么选择mybatis框架 它几乎避免了所有的JDBC的代码和手动设置参数及获取结果集.作用于持久层,支持定制化sql,存储过程及高级映射 项目所需要的jar包: lombok…

PowerShell系列(四):PowerShell进入交互环境的三种方式

目录 1、Win键X 方式 2、使用微软自带的搜索功能 3、命令行运行方式 4、命令行窗口方式 5、使用第三方命令行软件&#xff08;Terminal&#xff09;开启PowerShell环境 6、PowerShell交互环境执行脚本的一些优势 7、小技巧 今天继续给大家讲解PowerShell相关的知识&…

IMX6ULL裸机篇之DDR3实验-更新 imxdownload.h

一. DDR实验 之前关于 IMX6ULL开发板&#xff0c;有关DDR实验。做了DDR内存芯片的初始化&#xff0c;校验与超频测试。 博文链接如下&#xff1a; IMX6ULL裸机篇之DDR3初始化_凌雪舞的博客-CSDN博客 IMX6ULL裸机篇之DDR3校验与超频测试_凌雪舞的博客-CSDN博客 经过了初始化…

C Primer Plus第二章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.编写一个程序&#xff0c;调用一次 …

【Linux系列P3】Linux的权限有什么重点?一文带你理清!

前言 大家好&#xff0c;这里是YY的Linux系列part3&#xff1b;本章主要内容面向能使用Linux的老铁&#xff0c;主要内容是【Linux的用户&用户指令】【文件属性】【权限&权限值的两者表达方式】【权限相关指令】【起始权限问题与掩码问题】【粘滞位的概念与特殊权限-t解…

[Ext JS3.9] 标签面板(TabPanel )介绍与开发

标签面板 标签面板是RIA 类应用使用较多的组件, 因为其可以显示的内容比较多。 标签面板的效果如下图: 标签面板开发也很简单, 配置式的开发代码类似: {xtype: tabpanel,items: [{title: 标签页1,html:标签页1内容}, {title: 标签页2,html:标签页2内容}, {title: 标签页…

【教学类-34-05】拼图(数字学号0X-长方块拼图-双色深灰浅灰)3*3格子(中班主题《个别化拼图》偏艺术-美术)

作品展示 背景需求 难点&#xff1a;如何让生成图片带两个颜色的数字&#xff1f; 上一次学习活动中&#xff0c;发现03、04、05、06、08、09 、 23、26、28拼图都有困境&#xff0c;教师帮助。这些数字都包含圆弧结构&#xff0c;幼儿对于大量的圆弧碎片图形的多重组合&…

【Java-Crawler】一文学会使用WebMagic爬虫框架

WebMagic 爬虫主要分为采集、处理、存储三个部分。 在学 WebMagic 框架之前&#xff0c;需要了解 HttpClient、Jsoup&#xff08;Java HTML Parse&#xff09; 库&#xff0c;或者说会他们的基本使用。因为 WebMagic 框架内部运用了他们&#xff0c;在你出现问题看源码去查错时…

MySQL主从复制配置

一、MySQL主从概念 MysSQL主从复制是一个异步的复制过程&#xff0c;底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台AysQL数据库(slave&#xff0c;即从库&#xff09;从另一台MysQL数据库(master&#xff0c;即主库&#xff09;进行日志的复制然后再解析日志并应…

一、尚医通排班管理

文章目录 一、排班管理1、页面效果2、接口分析3、实现分析 二、排班管理实现1、科室列表1.1 api接口1.1.1 添加service接口与实现1.1.2 添加controller接口 1.2 科室前端1.2.1 添加路由1.2.2 添加按钮1.2.3封装api请求1.2.4 部门展示 2、排班日期分页列表2.1 api接口2.1.1 添加…