【深度学习实验】卷积神经网络(一):卷积运算及其Pytorch实现(一维卷积:窄卷积、宽卷积、等宽卷积;二维卷积)

目录

一、实验介绍

 二、实验环境

1. 配置虚拟环境

2. 库版本介绍

三、实验内容

1. 一维卷积

a. 概念

b. 示例

c. 分类

窄卷积(Narrow Convolution)

宽卷积(Wide Convolution)

等宽卷积(Same Convolution)

d. pytorch实现

2. 二维卷积

a. 概念

b. 示例

c. pytorch实现


一、实验介绍

        本文主要介绍了卷积运算及其Pytorch实现,包括一维卷积(窄卷积、宽卷积、等宽卷积)、二维卷积。

  

 二、实验环境

    本系列实验使用了PyTorch深度学习框架,相关操作如下:

1. 配置虚拟环境

conda create -n DL python=3.7 
conda activate DL
pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
conda install matplotlib
 conda install scikit-learn

2. 库版本介绍

软件包本实验版本目前最新版
matplotlib3.5.33.8.0
numpy1.21.61.26.0
python3.7.16
scikit-learn0.22.11.3.0
torch1.8.1+cu1022.0.1
torchaudio0.8.12.0.2
torchvision0.9.1+cu1020.15.2

三、实验内容

ChatGPT:

        卷积神经网络(Convolutional Neural Network,简称CNN)是一种深度学习模型,广泛应用于图像识别、计算机视觉和模式识别等领域。它的设计灵感来自于生物学中视觉皮层的工作原理。

        卷积神经网络通过多个卷积层、池化层全连接层组成。

  • 卷积层主要用于提取图像的局部特征,通过卷积操作和激活函数的处理,可以学习到图像的特征表示。
  • 池化层则用于降低特征图的维度,减少参数数量,同时保留主要的特征信息。
  • 全连接层则用于将提取到的特征映射到不同类别的概率上,进行分类或回归任务。

        卷积神经网络在图像处理方面具有很强的优势,它能够自动学习到具有层次结构的特征表示,并且对平移、缩放和旋转等图像变换具有一定的不变性。这些特点使得卷积神经网络成为图像分类、目标检测、语义分割等任务的首选模型。除了图像处理,卷积神经网络也可以应用于其他领域,如自然语言处理和时间序列分析。通过将文本或时间序列数据转换成二维形式,可以利用卷积神经网络进行相关任务的处理。

1. 一维卷积

a. 概念

        一维卷积是指在一维输入数据上应用滤波器(也称为卷积核或核)的操作。一维卷积在信号处理、自然语言处理等领域中有广泛的应用。

        假设我们有一个长度为n的输入向量和一个长度为m的卷积核。一维卷积的计算过程如下:

  • 将卷积核与输入向量的第一个元素对齐,进行元素相乘并求和。这个求和结果将作为卷积操作的输出值的第一个元素。

  • 将卷积核向右移动一个位置,再次进行相乘求和的操作。重复这个过程,直到卷积核覆盖完整个输入向量。

    • 输出向量的长度将是 M - K + 1,其中 M 是输入向量的长度,K 是卷积核的长度。

b. 示例

        假设我们有一个输入向量 [1, 1, -1, 1, 1, 1, -1, 1, 1],和一个卷积核[1, -2, 1]。我们可以按照以下步骤进行一维卷积(窄卷积)计算:

  • 第一个元素的计算:(1 * 1) + (1 * -2) + (-1 * 1) = -2
  • 第二个元素的计算:(1 * 1) + (-1 * -2) + (1 * 1) = 4
  • 第三个元素的计算:(-1 * 1) + (1 * -2) + (1 * 1) = -2
  • ………………

c. 分类

卷积的结果按输出长度不同可以分为三类:

  • 窄卷积(Narrow Convolution)
    • 步长 𝑇 = 1,两端不补零 𝑃 = 0
    • 卷积后输出长度为 𝑀 − 𝐾 +1
  • 宽卷积(Wide Convolution)
    • 步长 𝑇 = 1,两端不补零 𝑃 = 𝐾 -1
    • 卷积后输出长度为 𝑀 + 𝐾 - 1
  • 等宽卷积(Same Convolution)
    • 步长 𝑇 = 1,两端不补零 𝑃 = (𝐾 -1) / 2
    • 卷积后输出长度为 𝑀

注意:

  • 在早期的文献中,卷积一般默认为窄卷积;
  • 而目前的文献中,卷积一般默认为等宽卷积。

d. pytorch实现

import torch
import torch.nn.functional as F# 转换输入特征图和滤波器为张量
input_tensor = torch.tensor([1, 1, -1, 1, 1, 1, -1, 1, 1], dtype=torch.float32)
filter_tensor = torch.tensor([1, -2, 1], dtype=torch.float32)# 窄卷积计算
narrow_conv = F.conv1d(input_tensor.view(1, 1, -1), filter_tensor.view(1, 1, -1), stride=1, padding=0)
print("Narrow Convolution Result:")
print(narrow_conv)# 宽卷积计算
wide_conv = F.conv1d(input_tensor.view(1, 1, -1), filter_tensor.view(1, 1, -1), stride=1, padding=2)
print("Wide Convolution Result:")
print(wide_conv)# 等宽卷积计算
same_width_conv = F.conv1d(input_tensor.view(1, 1, -1), filter_tensor.view(1, 1, -1), stride=1, padding=1)
print("Same Width Convolution Result:")
print(same_width_conv)

输出:


 

2. 二维卷积

a. 概念

        二维卷积是一种常用的图像处理操作,它可以应用于二维图像或矩阵数据上。在二维卷积中,我们使用一个称为滤波器或卷积核的小矩阵对输入数据进行扫描和计算。在每个位置上,滤波器与输入数据的对应元素进行逐元素相乘,然后将所有乘积相加,得到输出的一个元素。通过滑动滤波器,我们可以在输入数据上执行卷积操作,并生成输出特征图

        具体而言,对于一个二维卷积操作,我们需要指定以下参数:

  • 输入数据:一个二维的输入矩阵或图像,通常表示为一个矩阵,其中每个元素代表一个像素值或特征值。
  • 滤波器(卷积核):一个小的二维矩阵,用于扫描输入数据并执行卷积操作。滤波器的大小通常是正方形,例如3x3、5x5等。
  • 步幅(stride):指定滤波器在输入数据上滑动的步长。例如,如果步幅为1,则滤波器每次滑动一个元素;如果步幅为2,则滤波器每次滑动两个元素。
  • 边界处理方式:决定如何处理输入数据边界上的情况。常见的方式包括补零(zero-padding)和截断(truncate)。

b. 示例

        假设有一个输入特征图(input feature map)的大小为5x5,其中的元素值如下所示:

[[1, 1, 1, 1, 1],[-1, 0, -3, 0, 1],[2, 1, 1, -1, 0],[0, -1, 1, 2, 1],[1, 2, 1, 1, 1]]

        现在我们有一个大小为3x3的卷积核(filter)如下所示:

[[1, 0, 0],[0, 0, 0],[0, 0, -1]]

        我们可以通过滑动窗口的方式将卷积核在输入特征图上进行计算。假设滑动步长(stride)为1,即每次滑动一个像素进行计算。以计算特征图第三个元素为例,计算过程如下:

  • 输入矩阵的子矩阵:
 1 1 1 
-1 0 -3 2 1 1 
  • 将卷积核的左上角放在输入特征图的第三个元素处,进行逐元素相乘并求和:
(1 * 1) + (1 * 0) + (1 * 0) + 
(-1 * 0) + (0 * 0) + (-3 * 0) + 
(2 * 0) + (1 * 0) + (1 * -1) = 1

将计算结果1作为特征图的第三个元素。

c. pytorch实现

import torch
import torch.nn as nn# 创建输入张量
input_tensor = torch.tensor([[1, 1, 1, 1, 1],[-1, 0, -3, 0, 1],[2, 1, 1, -1, 0],[0, -1, 1, 2, 1],[1, 2, 1, 1, 1]], dtype=torch.float32).unsqueeze(0).unsqueeze(0)# 创建卷积核张量
kernel_tensor = torch.tensor([[1, 0, 0],[0, 0, 0],[0, 0, -1]], dtype=torch.float32).unsqueeze(0).unsqueeze(0)# 翻转卷积核张量
kernel_tensor_flipped = torch.flip(kernel_tensor, [2, 3])# 定义卷积层
conv_layer = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, bias=False)# 将翻转后的卷积核张量加载到卷积层的权重中
conv_layer.weight.data = kernel_tensor_flipped# 执行卷积运算
output_tensor = conv_layer(input_tensor)# 打印输出张量
print(output_tensor)

  • 创建一个输入张量input_tensor和一个卷积核张量kernel_tensor
    • input_tensor是一个5x5的浮点型张量,表示上文所示输入数据。
    • kernel_tensor是一个3x3的浮点型张量,表示上文所示卷积核。
  • 使用torch.flip函数对卷积核张量进行翻转操作。(这个操作是为了将卷积核应用于输入数据时实现卷积运算的正确性)
  • 使用nn.Conv2d类定义了一个卷积层conv_layer
    • in_channels参数指定了输入张量的通道数,这里为1;
    • out_channels参数指定了输出张量的通道数,这里也为1;
    • kernel_size参数指定了卷积核的尺寸,这里为3;
    • bias参数指定是否使用偏置项,这里为False。
  • 将翻转后的卷积核张量加载到卷积层的权重中,即将kernel_tensor_flipped赋值给conv_layer.weight.data。这样设置了卷积层的权重,使其进行卷积运算时使用了翻转后的卷积核。
  • 执行卷积运算,将输入张量input_tensor通过卷积层conv_layer进行卷积操作,得到输出张量output_tensor

输出:

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

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

相关文章

Python开发与应用实验2 | Python基础语法应用

*本文是博主对学校专业课Python各种实验的再整理与详解,除了代码部分和解析部分,一些题目还增加了拓展部分(⭐)。拓展部分不是实验报告中原有的内容,而是博主本人自己的补充,以方便大家额外学习、参考。 &a…

Python3 如何实现 websocket 服务?

Python 实现 websocket 服务很简单,有很多的三方包可以用,我从网上大概找到三种常用的包:websocket、websockets、Flask-Sockets。 但这些包很多都“年久失修”, 比如 websocket 在 2010 年就不维护了。 而 Flask-Sockets 也在 2…

通信协议:Uart的Verilog实现(上)

1、前言 调制解调器是主机/设备与串行数据通路之间的接口,以串行单比特格式发送和接收数据。它也被称为通用异步收发器(Uart, Universal Asynchronous Receiver/Transmitter),这表明该设备能够接收和发送数据,并且发送和接收单元不同步。 本节…

递归算法讲解,深度理解递归

首先最重要的就是要说明递归思想的作用,在后面学习的高级数据接口,树和图中,都需要用到递归,即深度优先搜索,如果递归掌握的不好,后面的数据结构将举步为艰。 加油 首先看下如何下面两个方法有什么区别&a…

git revert 撤销之前的提交

git revert 用来撤销之前的提交,它会生成一个新的 commit id 。 输入 git revert --help 可以看到帮忙信息。 git revert commitID 不编辑新的 commit 说明 git log 找到需要撤销的 commitID , 然后执行 git revert commitID ,会提示如下…

Allegro如何将丝印文字Change到任意层面操作指导

Allegro如何将丝印文字Change到任意层面操作指导 在用Allegro进行PCB设计的时候,有时需要将丝印文字change到其它层面,如下图 可以看到丝印文字是属于REFDES这个Class的 如果需要把丝印文字change层面,只支持REFDES中以下的层面中来change

入门级制作电子期刊的网站推荐

随着数字化时代的到来,越来越多的人开始尝试制作自己的电子期刊。如果你也是其中的一员,那么这篇文章可以帮助你制作电子期刊。无论是初学者还是有一定经验的制作者,都能快速完成高质量的电子期刊制作 小编经常使用的工具是-----FLBOOK在线制…

95 # express 二级路由的实现

上一节实现了兼容老的路由写法,这一节来实现二级路由 二级路由实现核心: 进入中间件后,让对应的路由系统去进行匹配操作中间件进去匹配需要删除 path,存起来出去时在加上 示意图: 代码实现如下: rout…

ASCII码-对照表

ASCII 1> ASCII 控制字符2> ASCII 显示字符3> 常用ASCII码3.1> 【CR】\r 回车符3.2> 【LF】\n 换行符3.3> 不同操作系统,文件中换行 1> ASCII 控制字符 2> ASCII 显示字符 3> 常用ASCII码 3.1> 【CR】‘\r’ 回车符 CR Carriage Re…

安装OpenSearch

title: “安装opensearch” createTime: 2021-11-30T19:13:4508:00 updateTime: 2021-11-30T19:13:4508:00 draft: false author: “name” tags: [“es”,“安装”] categories: [“OpenSearch”] description: “测试的” 说明 基于Elasticsearch7.10.2 的 opensearch-1.1.…

arcgis搭建离线地图服务WMTS

Arcgis搭建离线地图服务WMTS 发布时间:2021-03-04 版权: ARCGIS搭建离线地图服务器,进行离线地图二次开发 2. 离线地图服务发布(WMTS服务) (详细教程:卫星地图_高清卫星地图_地图编辑_离线地…

商品秒杀系统整理

1、使用redis缓存商品信息 2、互斥锁解决缓存击穿问题,用缓存空值解决缓存穿透问题。 3、CAS乐观锁解决秒杀超卖的问题 4、使用redission实现一人一单。(分布式锁lua)脚本。 5、使用lua脚本进行秒杀资格判断(将库存和用户下单…

jupyter notebook进不去指定目录怎么办?

首先激活你要使用的虚拟环境 刚开始是现在 (base) C:\Users\lenovo>目录下 直接输入你想进入的盘 (base) C:\Users\lenovo>e:此时再cd (base) C:\Users\lenovo>cd E:\tim\learn_pytorch 就可以进入了 安装3.4.1.15问题 已经有了最新python版本的虚拟环境&#…

【实战项目之个人博客】

目录 项目背景 项目技术栈 项目介绍 项目亮点 项目启动 1.创建SSM(省略) 2.配置项目信息 3.将前端页面加入到项目中 4.初始化数据库 5.创建标准分层的目录 6.创建和编写项目中的公共代码以及常用配置 7.创建和编写业务的Entity、Mapper、…

GE IS220PVIBH1A 336A4940CSP16 电源模块

GE IS220PVIBH1A 336A4940CSP16 电源模块是通用电气(GE)的一种电源模块,用于工业控制和电力系统中,提供电源供应和保护功能。以下是这种类型电源模块的一般特点和功能: 电源供应:GE IS220PVIBH1A 336A4940C…

电脑WIFI突然消失

文章目录 1. 现象2. 解决办法1:重新启用无线网卡设置3. 解决办法2:更新无线网卡驱动4. 解决办法3:释放静电5. 解决办法4:拆机并重新插拔无线网卡 1. 现象 如下图:电脑在使用过程中WIFI消失 设备管理器中的无线网卡驱…

数据通信——应用层(域名系统)

引言 TCP到此就告一段落,这也意味着传输层结束了,紧随其后的就是TCP/IP五层架构的应用层。操作系统、编程语言、用户的可视化界面等等都要通过应用层来体现。应用层和我们息息相关,我们使用电子设备娱乐或办公时,接触到的就是应用…

19.组合模式(Composite)

意图:将对象组成树状结构以表示“部分-整体”的层次结构,使得Client对单个对象和组合对象的使用具有一致性。 上下文:在树型结构的问题中,Client必须以不同的方式处理单个对象和组合对象。能否提供一种封装&#xff0c…

基于jquery开发的Windows 12网页版

预览 https://win12.gitapp.cn 首页代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"refresh" content"0;urldesktop.html" /> <meta name"viewport&…

selenium中ActionChains方法详细讲解

前言 本文将介绍Selenium中的ActionChains类及其使用方法&#xff0c;帮助您模拟用户在网页上的鼠标和键盘操作。了解ActionChains的常用方法和示例代码&#xff0c;可轻松实现移动鼠标、点击元素、拖拽元素等操作。通过本文的学习&#xff0c;您能更好地应用ActionChains解决自…