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

news2024/10/6 2:20:28

目录

一、实验介绍

 二、实验环境

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.coloradmin.cn/o/1041525.html

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

相关文章

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

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

Python项目实战:基于2D或3D的区域增长算法

文章目录 一、简介二、项目实战2.1、2D图像(10x10)2.2、2D图像(100x100)2.3、3D图像(10x10x10) 一、简介 区域增长算法是一种用于图像分割方法,将相邻像素按照一定的相似性合并成一个区域。 步…

Spring 学习(九)整合 Mybatis

1. 整合 Mybatis 步骤 导入相关 jar 包 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency>…

规模化、可复制的大模型应用——企业知识管家

9月18日&#xff0c; “2023可信AI大会暨南京人工智能产业发展大会大模型高质量发展分论坛”在南京成功举办&#xff0c;九章云极DataCanvas公司受邀出席论坛&#xff0c;和与会嘉宾共同探讨大模型时代企业知识管理面临的挑战和机遇&#xff0c;同时作为大模型创新与应用代表企…

每日一题2023.9.25|LeetCode1367.二叉树中的链表

1367.二叉树中的链表 链接&#xff1a;LeetCode1367.二叉树中的链表 错误分析 其实这道题目思路很简单&#xff1a; 采用前序遍历的方式从根节点开始遍历二叉树&#xff0c;并在遍历的过程中比较与链表节点的值是否相等&#xff0c;如果当前链表节点的值和树节点的值相等&am…

怎样提高外贸业务销售能力

怎样提高外贸业务销售能力 一、市场分析与研究1. 了解目标市场&#xff1a;2. 收集客户信息&#xff1a; 二、产品知识和差异化竞争1. 熟悉产品&#xff1a;2. 差异化竞争&#xff1a; 三、制定销售策略和计划1. 制定销售计划&#xff1a;2. 销售策略&#xff1a; 四、谈判技巧…

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

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

Wespeaker框架训练(1)

1. 数据集准备(Data preparation) 进入wespeaker目录文件/home/username/wespeaker/examples/voxceleb/v2 对run.sh文件进行编辑 vim run.sh 可以看到run.sh里面的配置内容 #数据集下载&#xff0c;解压 stage1 #插入噪音&#xff0c;制作音频文件 stop_stage2 #数据集放置…

如何重装Windows Mirosoft Store

重装Windows Mirosoft Store 如何重装Windows Mirosoft Store呢&#xff1f;如何下载Windows Mirosoft Store呢&#xff1f;Windows Mirosoft Store不见了咋办&#xff1f;Windows 自带软件不见了咋办等等&#xff1f;写在前面 1.文件准备2.安装 如何重装Windows Mirosoft Stor…

Java之序列化的详细解析

3. 序列化 3.1 概述 Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象&#xff0c;该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后&#xff0c;相当于文件中持久保存了一个对象的信息。 反之&#xff0c;该字节…

vue做无缝滚动

类似于这种&#xff1a; 以上截图来自于官网&#xff1a;vue-seamless-scroll 具体使用步骤为&#xff1a; 1:安装 cnpm install vue-seamless-scroll --save  2&#xff1a;引入 <vue-seamless-scroll></vue-seamless-scroll>import vueSeamlessScroll from …

最熟悉的陌生人!Java运算符详解

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、算术运算符1、四则运算符2、增量运算符3、自增、自减运算符 二、关系运算符三、关系运算符1、逻辑与 &&2、逻辑或|…

【PDF提取页面】使用Adobe Acrobat提取PDF文档的某几个页面另存

▚ 01 使用Adobe Acrobat打开目标文件 ▚ 02 打开 ->页面缩略图Page Thumbnails ▚ 03 右键选择 -> 提取页面 Extract Pages… ▚ 04 选择提取的页数范围 &#x1f341; 一般设置提取页面的初始位置和截至位置即可。 ▚ 05 将提取的目标页面另存为->新PDF文

基于微信小程的流浪动物救助宠物领养平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

05_JavaScript基本语法

1 变量 1.1 标识符 程序开发中&#xff0c;经常需要自定义一些符号来标记一些名称&#xff0c;并赋予其特定的用途&#xff0c;如变量名、函数名等&#xff0c;这些符号都被称为标识符。 定义规则 由大小写字母&#xff08;A-Z,a-z&#xff09;、数字&#xff08;0-9&#…

[docker]笔记-网络故障处理

1、同事在虚拟机上部署docker&#xff0c;发现电脑无法登录虚拟机了。首先ping测是通的&#xff0c;从我电脑继续进行登录测试发现没问题&#xff0c;初步判断是她电脑网络和虚拟机网络之间连接出错。 2、进行虚拟机登录查看&#xff0c;首先使用route -n命令查看路由&#xf…

Java深入理解线程的三大特性

目录 1 CPU缓存导致可见性问题2 线程切换导致原子性问题3 性能优化导致有序性问题4 JMM(Java Memory Model)5 volatile6 synchronized 1 CPU缓存导致可见性问题 线程的三大特性&#xff1a; 可见性&#xff1a;Visibility有序性&#xff1a;Ordering原子性&#xff1a;Atomic…

YApi Pro

1.介绍 说明&#xff1a;YApi Pro 是一款高效、易用、功能强大的 API 管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务。它可以帮助开发者轻松创建、发布、维护 API&#xff0c;同时为用户提供了优秀的交互体验&#xff0c;开发人员可以更加高效地完…

【面试算法——动态规划 19】最长回文子序列 (hard)让字符串成为回文串的最少插入次数

516. 最长回文子序列 链接: 516. 最长回文子序列 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&…

C语言实现八种功能的通讯录(添加、删除、查找、修改、显示、排序、退出、清空)

通讯录功能概要及前提说明 此通讯录利用C语言完成&#xff0c;可以实现八种功能的通讯录&#xff08;添加、删除、查找、修改、显示、排序、退出、清空&#xff09; 代码由三部分组成&#xff0c;为什么要写成三部分而不写成一部分可以参考我以前的博客&#xff0c;如下&…