Python深度学习基础(九)——深入浅析卷积核

news2024/11/17 0:56:43

深入浅析卷积核

  • 引言
  • 单通道卷积
  • 简单图像
  • 边缘检测
  • 锐化
  • 高斯滤波

引言

在这里插入图片描述

提到卷积,应该多数人都会想到类似上图的这种示例,可以简单的理解成卷积核与图像中和卷积核相同大小的一块区域与卷积核相乘再求和,通过移动区域产生一个有和组成的新的图像,那么卷积核是什么呢,我们来看下面的例子

单通道卷积

首先,我们定义了一个单通道图像的卷积过程,我们用这个来验证卷积核的特性

def Conv2d(X,kernel):
    img_row,img_col = X.shape
    ker_row,ker_col = kernel.shape

    result = torch.zeros(img_row-ker_row+1,img_col-ker_col+1)
    res_row,res_col = result.shape

    for r in range(res_row):
        for c in range(res_col):
            result[r,c] = torch.sum(X[r:r+ker_row,c:c+ker_col]*kernel)
    return result

简单图像

我们建立两个图像,一个是X一个是Y

X = torch.tensor(
       [[1., 0., 0., 0., 0., 0., 1.],
        [0., 1., 0., 0., 0., 1., 0.],
        [0., 0., 1., 0., 1., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0.],
        [0., 0., 1., 0., 1., 0., 0.],
        [0., 1., 0., 0., 0., 1., 0.],
        [1., 0., 0., 0., 0., 0., 1.]])

Y = torch.tensor(
       [[1., 0., 0., 0., 0., 0., 1.],
        [0., 1., 0., 0., 0., 1., 0.],
        [0., 0., 1., 0., 1., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0.]])

他们画出图来效果如下
在这里插入图片描述
那么如果我们要分类,要通过什么分类呢?
我们观察到X和Y都有左斜向下,右斜向下的特征,但是X又多一个两个线交叉的特征
那么我们可以建立三个卷积核

#卷积核
kernel0=torch.tensor(
       [[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])
kernel1=torch.tensor(
       [[0., 0., 1.],
        [0., 1., 0.],
        [1., 0., 0.]])
kernel2=torch.tensor(
       [[1., 0., 1.],
        [0., 1., 0.],
        [1., 0., 1.]])

他们三个效果如下
在这里插入图片描述
我们对X卷积

X_kernel0 = Conv2d(X,kernel0)
X_kernel1 = Conv2d(X,kernel1)
X_kernel2 = Conv2d(X,kernel2)
plt.subplot(131)
plt.imshow(X_kernel0,cmap='gray_r')
plt.subplot(132)
plt.imshow(X_kernel1,cmap='gray_r')
plt.subplot(133)
plt.imshow(X_kernel2,cmap='gray_r')

在这里插入图片描述
可以看到三个卷积的特征都有被匹配
那么我们来看Y

X_kernel0_ = Conv2d(Y,kernel0_)
X_kernel1_ = Conv2d(Y,kernel1_)
X_kernel2_ = Conv2d(Y,kernel2_)

plt.subplot(131)
plt.imshow(X_kernel0_,cmap='gray_r')
plt.subplot(132)
plt.imshow(X_kernel1_,cmap='gray_r')
plt.subplot(133)
plt.imshow(X_kernel2_,cmap='gray_r')

在这里插入图片描述
可以看到左上和左下的特征被提取出来了,但是交叉的特征因为Y只有上半部分,所以只有上半部分被匹配上一部分

上面的过程就是卷积核用于提取特征的过程,当然不用担心,这些卷积核只是用于做个案例,实际上深度学习的卷积核的值是由反向传递学习得来,我们不需要担心自己设定卷积核的问题

边缘检测

上面我们在简单的图像中展示了卷积核的作用,下面我们来看一下卷积核在真实图像中是怎样的效果。
我们假设有这样一张兔子的图片
在这里插入图片描述
首先我们用灰度方式读入(下同)

img = cv2.imread('tuzi.jpg', cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap=plt.cm.gray)

在这里插入图片描述

我们想要获得他的边缘,那么就可以使用下面的卷积核
[ − 1 , − 1 , − 1 − 1 , 8 , − 1 − 1 , − 1 , − 1 ] \begin{bmatrix} -1 ,-1, -1 \\ -1 , 8 ,-1 \\ -1 ,-1, -1 \end{bmatrix} 111181111
这里做一下解释,这个核主要是侧重于中心,只要是中心不是和周围的像素完全一样,经过卷积之后就能得到一个正值,正值越大说明差别越明显,即边界,否则会得到负值或0

kernel_0 = torch.tensor([[-1, -1, -1],
                         [-1, 8, -1],
                         [-1, -1, -1]
                        ])
X_kernel_0 = Conv2d(torch.tensor(img), kernel_0)
plt.imshow(X_kernel_0, cmap=plt.cm.gray)

这样我们就得到了兔子的边缘
在这里插入图片描述

锐化

锐化需要以下卷积核
[ 0 , − 1 , 0 − 1 , 5 , − 1 0 , − 1 , 0 ] \begin{bmatrix} 0 ,-1, 0 \\ -1 , 5 ,-1 \\ 0 ,-1, 0 \end{bmatrix} 010151010
这里可以发现,和之前的边缘检测的卷积核相比,他只注重中心上下左右的像素,并且如果周围像素完全相同他也是会得到正值,这样的效果比边缘检测更加温和,并没有一下子把周围相同的像素完全取代,而是增强与周围差距大的像素点,抑制与周围差距小的像素点

kernel_1 = torch.tensor([[0, -1, 0],
                         [-1, 5, -1],
                         [0, -1, 0]
                        ])
X_kernel_1 = Conv2d(torch.tensor(img), kernel_1)
plt.imshow(X_kernel_1, cmap=plt.cm.gray)

在这里插入图片描述

高斯滤波

1 16 [ 1 , 2 , 1 2 , 4 , 2 1 , 2 , 1 ] \frac{1}{16}\begin{bmatrix} 1 ,2, 1 \\ 2 , 4 ,2 \\ 1 ,2, 1 \end{bmatrix} 161 121242121
高斯滤波就是使用符合高斯分布的卷积核,通常用于图像滤波,这里的图片没有高斯噪声,效果不明显,高斯滤波详细内容可以查看
opencv-python常用函数解析及参数介绍(三)——图像滤波

kernel_2 = torch.tensor([[1, 2, 1],
                         [2, 4, 2],
                         [1, 2, 1]
                        ]) / 16
X_kernel_2 = Conv2d(torch.tensor(img), kernel_2)
plt.imshow(X_kernel_2, cmap=plt.cm.gray)

在这里插入图片描述

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

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

相关文章

黑马学ElasticSearch(十二)

目录: (1)ES集群-集群结构介绍 (2)es集群-搭建集群 (3)es集群-集群职责及脑裂 (4)es集群-分布式新增和查询流程 (5) es集群-故障转移 &#…

传输层协议:TCP协议(下)——运作方式(如何三次握手、四次挥手等)

运作方式 TCP协议的运行可划分为三个阶段:连接创建(connection establishment)、数据传送(data transfer)和连接终止(connection termination)。操作系统将TCP连接抽象为套接字表示的本地端点(local end-p…

【PyTorch】教程:学习基础知识-(6) Autograd

AUTOMATIC DIFFERENTIATION WITH torch.autograd 在训练神经网络时,最常用的算法是反向传播算法,在该算法中,参数根据损失函数相对于给定参数的梯度进行调整。 为了计算这些梯度, PyTorch 有一个内置的微分引擎 torch.autograd …

2022秋招算法岗面经题:训练模型时loss除以10和学习率除以10真的等价吗(SGD等价,Adam不等价)

问题描述:训练深度学习模型时loss除以10和学习率除以10等价吗? 先说结论 这个问题的答案与优化器有关 使用Adam、Adagrad、RMSprop等带有二阶动量vtv_tvt​的优化器训练时,当我们将loss除以10,对训练几乎没有影响。使用SGD、Mo…

Streamlit自定义组件开发教程

在这篇文章中,我们将学习如何构建Streamlit组件以及如何发布streamlit组件供其他人使用。 使用 3D场景编辑器快速搭建三维数字孪生场景 1、什么是Streamlit组件? Streamlit 组件是一个可共享的 Streamlit 插件,可让你为应用程序添加新的视觉…

Java——子集

题目链接 leetcode在线oj题——子集 题目描述 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 题目示例 输入:nums [1,2,3] …

MySQL管理

1:MySQL管理1.1:系统数据库Mysql数据库安装完成后,自带了一下四个数据库,具体作用如下: 数据库 含义 mysql 存储MySQL服务器正常运行所需要的各种信息 (时区、主从、用 户、权限等) information…

性能测试/实战演示 H5 性能分析

W3C标准是浏览器标准,一般浏览器都支持W3C标准,它规定使用者可以通过api查询性能信息,可借用W3C协议完成自动化H5性能测试。 W3C官网:Navigation Timing 使用chrome浏览器对webview进行手工查看,伴随着业务增多&#x…

mysql:索引的数据结构,B树,B+树浅聊

mysql:索引的数据结构 什么是索引? 索引(Index)是帮助MySQL高效获取数据的数据结构 为什么学索引? 之前应该有概念说,把索引理解为目录,比如通过s就可以查询到s开头的汉子从哪也开始&#xff…

[网鼎杯 2020 青龙组]AreUSerialz

目录 信息收集 代码审计 前提知识 思路分析 绕过检测 方法一 poc payload 方法二 poc payload 信息收集 进入页面给出了源代码如下&#xff0c;是一道PHP的反序列化题目 <?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {pro…

Linux多线程 线程概念 | 线程VS进程 | 线程控制【万字精讲】

线程 一、线程概念 1. 知识支持及回顾 在我们一开始学习进程的时候。我们总说进程在内部执行时&#xff0c;是OS操作系统调度的基本单位。其实并不严谨&#xff0c;今天&#xff0c;我们要重新完善这个说法——线程在进程内部运行&#xff0c;线程是OS操作系统调度的基本单位…

WorkPlus移动办公平台,助力企业随时随地“指尖办公”

近年来&#xff0c;随着移动互联网的发展&#xff0c;越来越多的人习惯于随时随地通过移动设备完成工作、购物、游戏等。移动办公应用就是基于移动终端的信息化办公应用&#xff0c;利用企微、钉钉、WorkPlus等移动办公平台&#xff0c;实现企业与员工间的随时随地工作、沟通&a…

技术分享 | ClickHouse StarRocks 使用经验分享

作者&#xff1a;许天云 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 一. 大纲 本篇分享下个人在实时数仓方向的一些使用经验&#xff0c;主要包含了ClickHouse 和 StarRocks 这两款目…

ASP.NET MVC解决方案的搭建(.NET Framework)——C#系列(一)

一、新建项目 1、控制器新建 2、Service层新建 3、Business数据层新建 4、Commons公共层新建 5、Models实体层新建 二、调用接口 1、接口建立 Web API 2 控制器新建 2、调用 三、Swagger接口调试配置 1、添加NuGet包 在启动项中添加Swashbuckle NuGet包 2、访问 htt…

Vivado2018.3安装及注册指南-安装包获取

一、vivado 介绍 vivado设计套件 是FPGA 厂商赛灵思&#xff08;Xilinx&#xff09;公司最新的为其产品定制的集成开发环境&#xff0c;支持Block Design、Verilog、VHDL等多种设计输入方式&#xff0c;内嵌综合器以及仿真器&#xff0c;可以完成从设计输入、综合适配、仿真到…

mysql存储过程的基础知识

本文来简单说下存储过程的基础知识 文章目录概述什么是存储过程存储过程的优缺点概述 mysql官网提供的储存过程&#xff1a;https://www.mysqlzh.com/doc/225/499.html 什么是存储过程 简单的说&#xff0c;存储过程是一条或者多条SQL语句的集合&#xff0c;可视为批文件&…

SAP采购中不基于收货的发票校验的价差计算过程实例

年前最后一天上班了&#xff0c;我还在帮财务分析一个价差问题。源于财务用户头天的一个请求&#xff0c;在不基于收货的发票校验中&#xff0c;计算倒不难&#xff0c;难的是梳理数量的逻辑关系。不过总算时间也没白花&#xff0c;记录下来。下次就不算了&#xff0c;能解释清…

理解使用并查集

目录 一.并查集原理 1.概念&#xff1a; 2.性质 3.形式 4. 合并方式 二.并查集实现 1.成员变量 2.构造函数 3.查找根 4.合并集合 5.判断是否在一个集合 6.查看集合数量 三.并查集总代码 前言&#xff1a;理解并查集是为了接下来学习图要用&#xff0c;而会使用并查…

Linux:系统性能监控工具-tsar安装和使用

在上家公司做性能压力测试时就用过tsar&#xff0c;但总结文档留在了内部&#xff0c;正好借着最近工作内容又用上了tsar&#xff0c;总结起来 目录前言tsar介绍总体架构安装tasrtsar配置介绍配置文件定时任务配置日志文件tsar使用tsar实际使用参考查看可用的监控模块列表查看C…

本松新材创业板IPO终止:业绩下滑,客户较集中,周永松为实控人

撰稿|汤汤 来源|贝多财经 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;杭州本松新材料技术股份有限公司&#xff08;下称“本松新材”&#xff09;提交了撤回上市申请文件的申请&#xff0c;保荐人财通证券也撤回对该公司的保荐。因此&#xff0c;深交所终止了…