深度学习_卷积

卷积

卷积(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.rhkb.cn/news/279015.html

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

相关文章

数据结构之链式二叉树

当我们初步了解二叉树后 我们就可以进一步去深入学习二叉树了 1.链式二叉树的遍历 这里我们先去定义链式二叉树的结构 分为两个指针 一左一右 他们分别指向左子树和右子树 typedef int BTDataType;typedef struct BinaryTreeNode {BTDataType data;struct BinartTreeNod…

Django templates 存放html目录

模板 一概述 模板由两部分组成,一部分是HTML代码,一部分是逻辑控制代码(变量,标签,过滤器) 作用:可以通过一些逻辑控制代码减少一些重复的操作更快速的生成HTML代码,并且实现简单的…

php 对接Mintegral汇量海外广告平台收益接口Reporting API

今天对接的是Mintegral广告reporting api接口,拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到Mintegral后台就能看到文档地址以及参数: 文档地址:https://cdn-adn-https.rayjump.com/cdn-adn/reporting_api/MintegralRA.…

蓝桥杯刷题(十一)

1.卡片 反向思考&#xff0c;看k种卡片可以分给几位同学 代码 n int(input()) k 1 while k*(k1)<2*n:k1 print(k)2.美丽的2 代码 def f(x)->bool:while x:if x%102:return Truex//10return False cnt 0 for i in range(1,2021):if f(i):cnt1 print(cnt)3.单词分析 …

因聚而生 数智有为丨软通动力携子公司鸿湖万联亮相华为中国合作伙伴大会2024

3月14日&#xff0c;以“因聚而生 数智有为”为主题的“华为中国合作伙伴大会2024”在深圳隆重开幕。作为华为的重要合作伙伴和本次大会钻石级&#xff08;最高级&#xff09;合作伙伴&#xff0c;软通动力深度参与本次盛会&#xff0c;携前沿数智化技术成果和与华为的联合解决…

SpringCloud Bus 消息总线

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第八篇&#xff0c;即介绍 Bus 消息总线。 二、概述 2.1 遗留的问题 在上一篇文章的最后&#xff0c;我…

整型数组按个位值排序 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定一个非空数组(列表)&#xff0c;其元素数据类型为整型&#xff0c;请按照数组元素十进制最低位从小到大进行排序&#xff0c;十进制最低位相同的元素&#xf…

计算机网络——物理层(奈氏准则和香农定理)

计算机网络——物理层&#xff08;奈氏准则和香农定理&#xff09; 失真码间串扰奈氏准则&#xff08;奈奎斯特定理&#xff09;极限数据率 噪声信噪比香农定理奈氏准则和香农定理的区别 前面我们已经了解一些数据通信的基本知识&#xff0c;没有看过上一篇得小伙伴可以点击这里…

网络安全框架和云安全参考架构介绍

目录 一、网络安全框架 1.1 概述 1.2 IATF框架 1.2.1 框架来源 1.2.2 框架结构图 1.2.3 框架内容 1.2.3.1 人&#xff08;People&#xff09; 1.2.3.2 技术&#xff08;Technology&#xff09; 1.2.3.3 操作&#xff08;Operation&#xff09; 1.3 NIST网络安全框架 …

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

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

stm32-模拟数字转化器ADC

接线图&#xff1a; #include "stm32f10x.h" // Device header//1: 开启RCC时钟&#xff0c;包括ADC和GPIO的时钟//2&#xff1a;配置GPIO将GPIO配置为模拟输入模式//3&#xff1a;配置多路开关将左边的通道接入到规则组中//4&#xff1a;配置ADC转…

JNDI+LDAP攻击手法

服务端&#xff1a; package com.naihe3; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.URL;import javax.net.ServerSocketFactory; import javax.net.SocketFactory; import javax.net.ssl.SSLSocketFactory;import com.unboundid.…

局部路径规划算法 - 多项式曲线法

参考&#xff1a;局部路径规划算法——曲线插值法 0 前言 1 多项式曲线法 1.1 算法简介 曲线插值的方法是按照车辆在某些特定条件&#xff08;安全、快速、高效&#xff09;下&#xff0c;进行路径的曲线拟合&#xff0c;常见的有多项式曲线、双圆弧段曲线、正弦函数曲线、…

Redis各场景应用集合

应用场景 1、缓存&#xff08;Cache&#xff09;,分布式缓存 有一些存储于数据库中的数据会被频繁访问&#xff0c;如果频繁的访问数据库&#xff0c;数据库负载会升高&#xff0c;同时由于数据库IO比较慢&#xff0c;应用程序的响应会比较差。此时&#xff0c;如果引入Redis来…

CTF题型 SSTI(2) Flask-SSTI典型题巩固

CTF题型 SSTI(2) Flask-SSTI典型题巩固 文章目录 CTF题型 SSTI(2) Flask-SSTI典型题巩固前记1.klf__sstiSSTI_Fuzz字典&#xff08;网上收集自己补充&#xff09; 2.klf_2数字问题如何解决了&#xff1f;|count |length都被禁&#xff1f; 3.klf_3 前记 从基础到自己构造paylo…

手机备忘录怎么导出到电脑,如何将手机备忘录导出到电脑

备忘录是我们日常生活和工作中常用的工具之一&#xff0c;我们可以在手机上轻松地记录重要的事务、想法和灵感。然而&#xff0c;在某些情况下&#xff0c;我们可能需要将手机备忘录导出到电脑进行更详细的整理和管理。那么&#xff0c;手机备忘录怎么导出到电脑&#xff0c;如…

【tls招新web部分题解】

emowebshell (php7.4.21版本漏洞) 非预期 题目提示webshell&#xff0c;就直接尝试一下常见的后门命名的规则 如 shell.php这里运气比较好&#xff0c;可以直接shell.php就出来 要是不想这样尝试的话&#xff0c;也可以直接dirsearch进行目录爆破 然后在phpinfo中直接搜素c…

企业信息安全怎么防护?迅软科技有方法!

一、企业信息防护策略 1、数据加密 使用迅软DSE加密系统&#xff0c;对敏感数据进行加密处理&#xff0c;确保数据在传输和存储过程中的安全性&#xff0c;防止数据泄露。 2、数据备份和恢复 定期备份重要数据&#xff0c;并确保可以在发生灾难性事件后迅速恢复业务运作。 …

力扣大厂热门面试算法题 43-45

43. 字符串相乘&#xff0c;44. 通配符匹配&#xff0c;45. 跳跃游戏 II&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.18 可通过leetcode所有测试用例。 目录 43. 字符串相乘 解题思路 完整代码 Python Java 44. 通配符…

计算机网络的分类

目录 <计算机网络的分类> 1.按网络覆盖范围分 1)个人区域网PAN 2)局域网 3)城域网 4)广域网 5)互联网 2.按传输介质分类 3.按网络传输技术分类 4.按网络的使用性质分类 <计算机网络的分类> 计算机网络分类的方法很多&#xff0c;可以从不同的角度观察网络…