深度学习_卷积

卷积

卷积(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.mzph.cn/news/755302.shtml

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

相关文章

【Excel自动化办公】使用openpyxl对Excel进行读写操作

目录 一、环境安装 1.1 创建python项目 1.2 安装openpyxl依赖 二、Excel数据读取操作 三、Excel数据写入操作 3.1 创建空白工作簿 3.2 写数据 四、设置单元格样式 4.1 字体样式 4.2 设置单元格背景填充色 4.3 设置单元格边框样式 4.4 单元格对齐方式 4.5 数据筛选…

打造精益标杆生产线:从理念到实践的全面升级!

在制造业竞争日益激烈的今天,精益生产已成为企业提升效率、降低成本、增强竞争力的重要手段。那么,如何打造一条精益标杆生产线呢?本文,天行健精益制造咨询公司将从理念导入、流程优化、员工培训、持续改进等方面,为大…

MybatisPlus逆向工程

目录 🧂1.前提说明 🍿2.引入依赖 🌭3.使用导入模板 1.前提说明 注意 适用版本:mybatis-plus-generator 3.5.1 以下版本,3.5.1 及以上的请参考 3.5.1以上参考官网:3.5.1以上逆向工程 2.引入依赖 …

【Java Web基础】一些网页设计基础(一)

文章目录 1. 父盒子下子盒子的左右浮动布局2. 浮动布局中,高度较小的盒子撑起整个盒子的高度3. 在2中,logo和title都是顶着放置的,让logo和title垂直居中4. 字体大小自适应5. 响应式布局 1. 父盒子下子盒子的左右浮动布局 父盒子CSS&#xff…

汽车制造产生的污废水如何处理排放

汽车制造业是一个重要的工业领域,然而,伴随着汽车制造过程中的各种化学反应和材料加工,大量污废水也随之产生。为了保护环境和社会的可持续发展,汽车制造产生的污废水需要得到妥善处理和排放。 首先,针对汽车制造中涉及…

二阶段提交的理解

两阶段提交2PC是分布式事务中最强大的事务类型之一,两段提交就是分两个阶段提交: 第一阶段询问各个事务数据源是否准备好。第二阶段才真正将数据提交给事务数据源。 为了保证该事务可以满足ACID,就要引入一个协调者(Cooradinator…

如何使用phpStudy在Windows系统部署静态站点并实现无公网IP远程访问

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点,测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中,查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…

Zookeeper(二)一致性协议2PC,3PC

目录 1.1 2PC协议1.1.1 协议说明1.1.2 优缺点同步阻塞单点问题数据不一致容错性不好 1.2 3PC 协议1.2.1 协议说明1.2.2 优缺点 官网:Apache ZooKeeper 1.1 2PC协议 2PC,是Two-Phase Commit的缩写,即二阶段提交,是计算机网络尤其…

Java实现定时发送邮件(基于Springboot工程)

1、功能概述? 1、在企业中有很多需要定时提醒的任务:如每天下午四点钟给第二天的值班人员发送值班消息?如提前一天给参与第二天会议的人员发送参会消息等。 2、这种定时提醒有很多方式如短信提醒、站内提醒等邮件提醒是其中较为方便且廉价的…

upload-labs·文件上传(靶场攻略)

目录 1.文件上传漏洞 1.1.文件上传漏洞介绍 1.2.文件上传漏洞危害 1.3.文件上传漏洞满足条件 1.4.文件检测流程 1.5.文件上传思路 1.6.web界面存在的风险点 1.7.文件上传实战思路 2.靶场搭建 3.文件上传 3.1.upload-labs第一关 3.2.检测文件类型 3.2.1.基本概念 3…

webconfig-boot分布式项目Web一站式配置

1、前言 最近利用空余时间写了一个项目webconfig-boot 。该项目主要配置了web项目常用的一些配置,如统一参数校验、统一异常捕获、统一日期的处理、常用过滤器、常用注解等。引入依赖接口完成常规的web配置。 这里也是总结了笔者在项目开发中遇到的一些常用的配置…

基于Spring Boot的社区垃圾分类管理平台的设计与实现

摘 要 近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,社区垃圾分类管理平台利用计算机网络实现信息化管理,使整个社区垃圾分类管理的发展和服务水平有显著提升。 本文拟…

LLM流式方案解决方案和客户端解决方案

背景 接上一篇《LLM大模型统一封装接口解决方案》架构确定后,流式方案非常规请求,需要特殊处理。 本解决方案就是针对上一篇中所需要的流式(打字机效果进行编码) 什么是SSE SSE(Server-Sent Events,服务器发…

C++初阶:string类的模拟自实现

目录 1. 引子2. 自实现string类功能模块3. string类功能模块的具体实现3.1 默认成员函数3.2 遍历访问相关成员函数3.3 信息插入相关成员函数3.4 信息删除3.5 信息查找3.6 非成员函数3.7 杂项成员函数 4. 补充知识 1. 引子 通过对string类的初步学习,没有对知识进行较…

MRP(VBA系列):6.SIOP:将PO的信息加入到Net后面

这个比较简单,就是将两个表格的信息组合起来。 Tips:所有代码都是为目前任职公司编写,极大概率不适合其他公司,在这里发布:首先是记录;其次才是分享,望理解! 效果图: 思…

聚合音乐网-播放器网站源码

源码简介 MKOnlineMusicPlayer 是一款全屏的音乐播放器 UI 框架(为避免侵权,已移除所有后端功能)。 前端界面参照 QQ 音乐网页版进行布局,同时采用了流行的响应式设计,无论是在PC端还是在手机端,均能给您…

初识 linux

什么是linux Linux,一般指GNU/Linux(单独的Linux内核并不可直接使用,一般搭配GNU套件,故得此称呼),是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹(Linu…

【Linux】shell命令运行原理---认识Linux基本指令

主页:醋溜马桶圈-CSDN博客 专栏:Linux_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.shell命令以及运行原理 1.1 shell命令 1.2 Linux内核权限 1.3 图示Linux shell和bash的区别 2.认识Linux基本指令 2.1 指令的…

寻找可能认识的人

给一个命名为:friend.txt的文件 其中每一行中给出两个名字,中间用空格分开。(下图为文件内容) 题目:《查找出可能认识的人 》 代码如下: RelationMapper: package com.fesco.friend;import or…

【测试开发学习历程】MySQL条件查询与通配符 + MySQL函数运算(上)

前言: 18日08:56,总要先写完明天的博客,才能安心准备今天或者明天的学习。 半夜爬起来写博客真的好辛苦!!!!!!!!! 回归…