深度学习_卷积

卷积

卷积(Convolution)是数学和计算机科学中的一个重要概念,特别在信号处理和图像处理中应用广泛。在信号处理领域,卷积是两个函数之间的一种数学操作,它表示两个函数的重叠部分的积分量

在图像处理中,卷积通常用于图像滤波和特征提取。卷积操作通过将一个函数(通常是一个图像)与另一个函数(通常是一个小的滤波器或内核)进行卷积运算来生成一个新的函数(通常是一个处理后的图像)。这个滤波器或内核在输入图像上滑动,并与输入图像的局部区域进行卷积操作,从而对图像进行平滑、边缘检测、特征增强等处理。

卷积在深度学习和神经网络中也起到了重要作用。在卷积神经网络(Convolutional Neural Networks,CNNs)中,卷积层使用可学习的卷积核来提取图像的特征,从而实现图像分类、目标检测等任务。通过在网络中堆叠多个卷积层,可以逐渐提取出更加抽象和高级的特征,使网络能够对输入的图像进行更加复杂的分析和理解。

卷积在pytorch中有两种实现方式:

  • torch.nn.Conv2d()
  • torch.nn.functional.conv2d()

输入要求:
torch.autograd.Variable()的类型:
大小是(batch, channel, H, W)
batch------一批数据的数量
channel------输入的通道数(彩色3,灰度1,卷积网络中通道数可达几十到几百个)
H------图像的高度
W------图像的宽度

实例

图像准备:
将图像放在代码相同文件夹中
在这里插入图片描述

加载图像并显示

python库准备:

  • numpy
  • torch
  • matplotlib

代码

import numpy as np
import torch
from torch import nn
from torch.autograd import Variable
import torch.nn.functional as F
from PIL import Image
import matplotlib.pyplot as plt
im = Image.open('./cat.png').convert('L')  # 打开图像文件,并将图像转换为灰度图
im = np.array(im, dtype='float32')  # 将图像转换为numpy数组,数据类型是32位浮点数
# plt.imshow(im.astype('uint8'), cmap='gray')  # 显示,转换为无符号8位整型
# plt.show()  # 让图像窗口保持打开状态

执行代码得到小猫灰度图:
在这里插入图片描述

定义卷积算子进行轮廓检测:

-用 torch.nn.Conv2d()对图像进行操作:

import numpy as np
import torch
from torch import nn
from torch.autograd import Variable
import torch.nn.functional as F
from PIL import Image
import matplotlib.pyplot as plt
im = Image.open('./cat.png').convert('L')  # 打开图像文件,并将图像转换为灰度图
im = np.array(im, dtype='float32')  # 将图像转换为numpy数组,数据类型是32位浮点数
im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
# 将numpy数组转换为pytorch张量,并将其形状调整为(1,1,im.shape[0], im.shape[1])即卷积层期望输入具有四个维度:(batch_size, channels, height, width)
conv1 = nn.Conv2d(1, 1, 3, bias=False)
# 输入通道数1表示灰度图像,输出通道数1表示生成的特征图的数量。卷积核大小为 3,表示一个 3x3 的卷积核。bias=False 表示在卷积中不使用偏置项。
sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32')
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3))  # Sobel边缘检测卷积核,并将其形状调整为(1, 1, 3, 3)
conv1.weight.data = torch.from_numpy(sobel_kernel)
edge1 = conv1(Variable(im))  # 张量 im 传递给卷积层,得到了输出张量 edge1
edge1 = edge1.data.squeeze().numpy()  # 张量中提取NumPy数组,并使用.squeeze()去除维度为1的尺寸
plt.imshow(edge1, cmap='gray')
plt.show()

结果:
在这里插入图片描述

torch.nn.functional.conv2d() 对图像进行操作:

import numpy as np
import torch
from torch import nn
from torch.autograd import Variable
import torch.nn.functional as F
from PIL import Image
import matplotlib.pyplot as plt
im = Image.open('./cat.png').convert('L')  # 打开图像文件,并将图像转换为灰度图
im = np.array(im, dtype='float32')  # 将图像转换为numpy数组,数据类型是32位浮点数
im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32')
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3))
weight = Variable(torch.from_numpy(sobel_kernel))
edge2 = F.conv2d(Variable(im), weight)
edge2 = edge2.data.squeeze().numpy()
plt.imshow(edge2, cmap='gray')
plt.show()

结果图:
在这里插入图片描述

  • 可以看到上面两种方法所得结果相同,那么区别是什么呢?

分析

在PyTorch中,torch.nn.Conv2d()torch.nn.functional.conv2d()都是用于进行二维卷积操作的函数,区别在于:

  1. 模块(Module)与函数(Function):

    • torch.nn.Conv2d()是一个模块(Module),属于PyTorch的神经网络模块之一。这意味着它是一个具有状态的对象,可以在神经网络中被实例化、调用,并且具有可学习的参数。
    • torch.nn.functional.conv2d()是一个函数(Function),属于PyTorch的函数式接口。这意味着它是一个纯函数,不包含任何可学习的参数,通常在用户需要更大的灵活性时使用。
  2. 使用方式:

    • torch.nn.Conv2d()通常与其他模块一起使用,例如在构建神经网络时作为网络的一部分。它被实例化为一个对象,可以通过调用该对象进行卷积操作,并且包含了可学习的卷积核参数。
    • torch.nn.functional.conv2d()通常在用户需要在神经网络的前向传播中进行卷积操作时使用。由于它是一个函数,可以直接调用该函数进行卷积操作,但需要手动传递卷积核参数。
  3. 参数传递:

    • 在使用torch.nn.Conv2d()时,通常需要将输入数据和卷积核参数传递给该对象的实例,并且可以通过调用实例进行卷积操作。
    • 在使用torch.nn.functional.conv2d()时,需要手动传递输入数据、卷积核参数以及其他参数,如步幅(stride)、填充(padding)等。

总的来说,torch.nn.Conv2d()提供了更加面向对象的使用方式,适用于构建神经网络模型;
torch.nn.functional.conv2d()则更加灵活,适用于需要在自定义的前向传播函数中进行卷积操作的情况。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript数组排序sort自定义函数不生效

背景 刷LeetCode时,遇到一道简单的数组排序题: 问题 想着直接用js的数组sort自定义排序即可,奈何测试用例运行总是不通过,返回的一直都是原数组。 代码排查 复制代码到Firefox浏览器控制台运行,结果输出的是正确结果&a…

搭建Hadoop集群(完全分布式运行模式)

目录 一、准备模板机(最小化安装)二、配置一台纯净的模板机修改主机名固定IP地址通过yum安装方式安装必要的软件关闭防火墙且禁止自启修改hosts映射文件创建普通用户 并让他能用sudo命令在/opt下创建software和module完成 三、搭建完全分布式运行模式3.1克隆第一台机器hadoop10…

基于PCA(主成分分析)的人面识别,Matlab实现

博主简介: 专注、专一于Matlab图像处理学习、交流,matlab图像代码代做/项目合作可以联系(QQ:3249726188) 个人主页:Matlab_ImagePro-CSDN博客 原则:代码均由本人编写完成,非中介,提供…

Vue学习日记 Day7 —— json-server工具、基于VueCli自定义创建项目、postcss插件

一、前一天Vuex总结 1、state作用:存放数据定义:state:{//数据 }使用://放在data下(1)根节点直接访问this.$store.state.数据名(2)模块直接访问this.$store.state.模块名.数据名(3)根节点辅助函数mapState([所需要的数据])(4)模块辅助…

JDK21虚拟线程

目录 虚拟线程 话题 什么是平台线程? 什么是虚拟线程? 为什么要使用虚拟线程? 创建和运行虚拟线程 使用线程类和线程创建虚拟线程。生成器界面 使用Executor.newVirtualThreadPerTaskExecutor()方法创建和运行…

【一】【单片机】有关LED的实验

点亮一个LED灯 根据LED模块原理图,我们可以知道,通过控制P20、P21...P27这八个位置的高低电平,可以实现D1~D8八个LED灯的亮灭。VCC接的是高电平,如果P20接的是低电平,那么D1就可以亮。如果P20接的是高电平,…

CSS基础属性(学习笔记)

一、CSS介绍 CSS即层叠样式表/级联样式表,简称样式表 html:写网页结构内容 css:写网页样式 实现了内容与表现的分离,提高了代码的重用性和维护性 CSS注释不被浏览器解析,给开发人员一个标注 快捷键:ctrl/ 语…

YOLOv5独家改进:block改进 | RepViTBlock和C3进行结合实现二次创新 | CVPR2024清华RepViT

💡💡💡本文独家改进:CVPR2024 清华提出RepViT:轻量级新主干!从ViT角度重新审视移动CNN,RepViTBlock和C3进行结合实现二次创新 改进结构图如下: 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创…

FTP文件传输协议

FTP 文章目录 FTP1. ftp简介2. ftp架构3. ftp数据连接模式4. 用户认证5. vsftpd5.1 vsftpd安装5.2 配置匿名用户ftp5.2.1上传(下面使用的是FileZilla软件)5.2.2下载5.2.3创建5.2.4删除 5.3配置本地(系统)用户ftp5.3.1上传5.3.2下载…

Qt教程 — 3.4 深入了解Qt 控件:Input Widgets部件(3)

目录 1 Input Widgets简介 2 如何使用Input Widgets部件 2.1 Dial 组件-模拟车速表 2.2 QScrollBar组件-创建水平和垂直滚动条 2.3 QSlider组件-创建水平和垂直滑动条 2.4 QKeySequenceEdit组件-捕获键盘快捷键 Input Widgets部件部件较多,将分为三篇文章介绍…

网络基础知识-DNS与DHCP+网络规划与设计故障诊断+嵌入式系统设计师备考笔记

0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记,未经本人许可,请勿转载,如发现本笔记内容的错误还望各位不吝赐教(笔记内容可能有误怕产生错误引导)。 本章的主要内容见下图: 本章知识和计算机…

创意二维码营销案例:帕森斯设计学院在巴黎市中心搭建“沙滩度假地”

作为一个专业的艺术设计学院,帕森斯设计学院(Parsons School of Design, The New School)以其卓越的教学质量和创新的设计理念享誉全球。 每年的夏天,帕森斯设计学院都会举办一个暑期短期项目,面向全球学生&#xff0…

AI时代,Matter如何融入与服务中国智能家居市场,助力中国企业出海?

随着智能家居产业的飞速发展,丰富多样的智能家居产品为消费者带来了便利的同时,因为不同品牌、不同产品之间的协议与标准不统一,导致消费者体验产生割裂,本来想买个“智能”家居,结果买了个“智障”家居,这…

Qt学习--多态(虚函数)

这次来分享多态的概念,这是比较重要的知识点 面向对象的三大特征:封装、继承、多态 首先:来点官方术语: 多态,通俗来讲就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出…

软考88-上午题-【操作系统】-进程的状态及状态间的切换

一、三态模型 多道程序系统: 在单道程序系统中,计算机内存中只允许一个程序运行,而多道程序系统则允许多个程序同时运行,从而大大提高了系统的整体性能。 通过允许多个程序同时运行和共享资源,多道程序设计技术使得操作…

使用uniapp,uni-data-select组件时,内容长度没超过容器宽度时候虽然能显示全内容但是数据后边会出现三个点,逼死强迫症

项目场景: 微信小程序开发,使用uniapp,uni-data-select组件时,内容长度没超过容器宽度时候虽然能显示全内容但是数据后边会出现三个点,逼死强迫症 解决方案: 找到组件的源代码,然后删除那三个…

layui2.9.7-入门初学

下载:https://layui.dev/ 下载后解压: 在hbuider中新建一个项目 将如上解压好的文件打开,复制如下到项目中 写案例,基础学习通之前的bootstrap 那样,挨个相中哪个就测试哪个,在这里不再重复罗列&#x…

windows跳板机配置(端口转发)

目录 前言操作步骤端口防火墙开放测试参考 前言 跳板机一般用于异构网络间的中转站,比如对方在防火墙上只给你开放了一台服务器的权限,你无法访问对方局域网的其它主机,但你能访问的这台服务器则有权限访问其它主机。那么这台服务器就可以作…

Docker 从0安装 nacos集群

前提条件 Docker支持一下的CentOs版本 Centos7(64-bit),系统内核版本为 3.10 以上Centos6.5(64-bit) 或者更高版本,系统内核版本为 2.6.32-431 或者更高版本 安装步骤 使用 yum 安装(CentOS 7下) 通过 uname -r 命令查看你当…

Go web 基础相关知识

Go web Web工作方式 浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址找到IP对应的服务器后,要求建立TCP连接,等浏览器发送完HTTP …
最新文章