29.图像卷积代码实现

news2025/2/3 17:01:53

1. 互相关运算

在这里插入图片描述
接下来,我们在corr2d函数中实现如上过程,该函数接受输入张量X和卷积核张量K,并返回输出张量Y。

import torch
from torch import nn
from d2l import torch as d2l

def corr2d(X,K): # X是输入,K是核矩阵
    '''计算二维互相关运算'''
    # 从K的shape中拿出h(height)--行数和w(wide)--列数
    h, w = K.shape # 核的行数和列数
    
    # 输出的行数=输入的行数-核的行数+1,列数同理
    Y = torch.zeros((X.shape[0]-h+1,X.shape[1]-w+1))
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            Y[i,j] = (X[i:i+h,j:j+w] * K).sum()
    return Y

验证上述二维互相关运算的输出。

X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
corr2d(X, K)

在这里插入图片描述

2. 卷积层

卷积层对输入和卷积核权重进行互相关运算,并在添加标量偏置之后产生输出。 所以,卷积层中的两个被训练的参数是卷积核权重和标量偏置。 就像我们之前随机初始化全连接层一样,在训练基于卷积层的模型时,我们也随机初始化卷积核权重

基于上面定义的corr2d函数实现二维卷积层。在__init__构造函数中,将weight和bias声明为两个模型参数。前向传播函数调用corr2d函数并添加偏置

class Conv2D(nn.Module):
    def __init__(self,kernel_size):
        super().__init__()
        # 可以在kernel_size这个参数传一个tuple,例如(3,3),则weight就是3*3的随机初始值了
        self.weight = nn.Parameter(torch.rand(kernel_size))
        self.bias = nn.Parameter(torch.zeros(1))
    
    def forward(self,x):
        return corr2d(x,self.weight) + self.bias

3.图像中目标的边缘检测

如下是卷积层的一个简单应用:通过找到像素变化的位置,来检测图像中不同颜色的边缘。 首先,我们构造一个6 * 8像素的黑白图像。中间四列为黑色(0),其余像素为白色(1)。

在这里插入图片描述

接下来,我们构造一个高度为1、宽度为2的卷积核K。当进行互相关运算时,如果水平相邻的两元素相同,则输出为零,否则输出为非零。

K = torch.tensor([[1.0, -1.0]])

现在,我们对参数X(输入)和K(卷积核)执行互相关运算。 如下所示,输出Y中的1代表从白色到黑色的边缘,-1代表从黑色到白色的边缘,其他情况的输出为0。

如果两个元素没有改变,如都是1,则结果为0,或者两个元素都是0,结果也为0。反之,元素改变了如1,0,则结果为1,两个元素为0,1,则结果为-1.因此可以做白到黑的边缘检测。

在这里插入图片描述

现在我们将输入的二维图像转置,再进行如上的互相关运算。 其输出如下,之前检测到的垂直边缘消失了。 不出所料,这个卷积核K只可以检测垂直边缘,无法检测水平边缘。

因为是1 * 2,只有相邻的2列参与运算,X转置后,相邻列元素是相同的,也就是每一行内的元素一致,进行相关运算后都为0,看不出变化,所以检测不了水平。要想解决的话,K也需要转置变成 2 *1。

在这里插入图片描述

4. 学习卷积核

如果我们只需寻找黑白边缘,那么以上[1, -1]的边缘检测器足以。然而,当有了更复杂数值的卷积核,或者连续的卷积层时,我们不可能手动设计滤波器。那么我们是否可以学习由X生成Y的卷积核呢?

现在让我们看看是否可以通过仅查看“输入-输出”对来学习由X生成Y的卷积核。 我们先构造一个卷积层,并将其卷积核初始化为随机张量。接下来,在每次迭代中,我们比较Y与卷积层输出的平方误差,然后计算梯度来更新卷积核。为了简单起见,我们在此使用内置的二维卷积层,并忽略偏置

关于内置的二维卷积层

# 构造一个二维卷积层,它具有1个输入通道和输出通道,以及形状为(1,2)的卷积核
# 黑白图片通道为1,彩色图片通道为3
conv2d = nn.Conv2d(1,1,kernel_size=(1,2),bias = False)

# 这个二维卷积层使用四维输入和输出格式(批量大小、通道、高度、宽度),
# 其中批量大小和通道数都为1
# ps:对所有的框架来说,向Conv2d传递的参数都是4d的
X = X.reshape((1,1,6,8))
Y = Y.reshape((1,1,6,7))

# 手写训练逻辑,迭代10轮
for i in range(10): 
    Y_hat = conv2d(X)
    l = (Y_hat - Y) **2
    conv2d.zero_grad()
    l.sum().backward()
    # 做了backward()之后,就能通过.grad获得梯度
    conv2d.weight.data[:] -= 3e-2 *conv2d.weight.grad # 3e-2是学习率
    if (i+1) % 2 ==0: # 每两轮迭代就输出loss
        print(f'batch {i+1},loss{l.sum():.3f}')

在这里插入图片描述
在10次迭代之后,误差已经降到足够低。现在我们来看看我们所学的卷积核的权重张量。

在这里插入图片描述
细心的读者一定会发现,我们学习到的卷积核权重非常接近我们之前定义的卷积核K。

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

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

相关文章

Cambridge IGCSE Chemistry 真题讲解1

考试局:Cambridge Assessment International Education (CAIE)考试类别:Cambridge International General Certificate of Secondary Education (IGCSE)考试科目:Chemistry考试单元:Paper 2 Multiple Choice (Extended)试卷代码&a…

什么是混合云、公有云、私有云?

很多用户都不清楚混合云、公有云、私有云的定义是什么,很多用户都不是很清楚具体的含义接下来一起跟着小编来看看吧。 一、混合云( hybrid cloud) 在混合云模式中,云平台由两种不同模式(私有或公有)云平台组合而成。这些平台依然是独立实体,但…

GIt远程仓库pull拉取代码

GIt远程仓库pull拉取代码 git教程可以参考之前的这篇文章使用git命令对gitee存放项目到仓库、切换分支以及合并分支教程 这篇文章主要说一下远程连接拉去并提交代码 如果你使用git clone <项目地址>拉取代码后更改无法提交的问题&#xff0c;可以使用以下解决方案 本地…

C++基础学习笔记(三)——核心编程PART1

参考链接&#xff1a;https://www.bilibili.com/video/BV1et411b73Z?p84&vd_sourceb4d9cee68649c8adcb1e266f7147cd5c 一、内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理…

LeetCode 92 双周赛

2481. 分割圆的最少切割次数 圆内一个 有效切割 &#xff0c;符合以下二者之一&#xff1a; 该切割是两个端点在圆上的线段&#xff0c;且该线段经过圆心。该切割是一端在圆心另一端在圆上的线段。 一些有效和无效的切割如下图所示。 给你一个整数 n &#xff0c;请你返回将…

从CRUD到入职阿里,全靠猛刷P8总结的Github所有高热度面试题合集

很多工作过了 5 年之后的工程师&#xff0c;都表示写不动 CRUD 代码了&#xff0c;都会考虑转架构师&#xff0c;但是一想到面试&#xff0c;可能心里就会一紧。 一般面试大厂架构师的岗位至少需要 3 轮技术面试&#xff0c;我咨询了一下阿里的大佬&#xff0c;了解到每一轮的…

专利解析|数据中台—数据流配置弹框交互优化方法

优化用户交互 在企业信息化转型的过程中&#xff0c;数据中台提供全行业从咨询规划到技术平台落地运营的数字化方案。随着企业规模的不断扩大&#xff0c;企业信息化转型的必要性也逐步地增加&#xff0c;其功能的复杂度更是跨越式地增加。人们在处理信息、学习规程和记忆细节…

【Go】参数验证,对象数组核验-validator

文章目录背景功能介绍范围比较验证标记之间特殊符号说明字符串验证特殊字符串验证例子扩展问题我的问题验证slice举例输出说明详细举例二维slice举例&#xff1a;说明map核验举例输出说明嵌套map核验举例说明参考背景 一直做的 go 项目中想要方便简洁的对接口参数字段进行核验…

HTTP模块的数据结构

1.ngx_module_t 1.1数据定义 背景&#xff1a; ngx_module_t结构体作为所有模块的通用接口&#xff0c;它只定义了init_master、init_module、init_process、init_thread、ext_thread、exit_process、exit_master这7个回调方法&#xff08;事实上&#xff0c;init_master、i…

DEJA_VU3D - Cesium功能集 之 090-台风过境实时动画

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小130个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(尽可能把代码简洁一些)。博文内容…

内网穿透软件对比——cpolar : 花生壳(上)

系列文章 内网穿透软件对比——cpolar : 花生壳&#xff08;上&#xff09;内网穿透软件对比——cpolar : 花生壳&#xff08;中&#xff09;内网穿透软件对比——cpolar : 花生壳&#xff08;下&#xff09; 文章目录系列文章1. 前言2. 对比内容2.1 官网主页对比2.2 用户注册…

JS中的事件循环机制(Event Loop)

JS中的事件循环机制(Event Loop) javascript是单线程的非阻塞的脚本语言 单线程 只有一个主线程来处理任务。非阻塞 JS引擎执行异步任务时&#xff0c;不会一直等待返回结果&#xff0c;主线程会挂起&#xff08;pending&#xff09;这个任务&#xff0c;继续执行其他任务&am…

微三云(陈志坤):共享购商业模式概念、框架、基础制度

各位企业家及创业者朋友们&#xff0c;你们好。我是微三云&#xff08;陈志坤&#xff09;&#xff0c;在你打开这个文章的时候&#xff0c;先不要急&#xff0c;因为任何一个能够长久、安稳、盈利的平台&#xff0c;背后肯定有一位看准宏观方向且耐心的人。这是一个极具颠覆性…

php宝塔搭建部署实战零起飞OA办公管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的零起飞OA办公管理系统源码&#xff0c;感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板文字搭建教程 下载源码&#xff0c;宝…

Mybatis对MySQL中BLOB字段的读取

一、使用TEXT还是BLOB&#xff1f; 1、TEXT和BLOB主要差别 主要差别就是BLOB保存二进制数据&#xff0c;TEXT保存字符数据。 目前几乎博客内容里图片都不是二进制存储在数据库的&#xff0c;而是把图片上传到服务器&#xff0c;然后正文里使用<img>标签引用&#xff0c…

电脑系统下载的镜像文件在哪里图解

如果你在小白系统上面下载了镜像文件&#xff0c;但是不知道下载完成怎么找到它的话&#xff0c;下面就和小编一起来看一下小白系统下载的镜像文件知道方法。 工具/原料&#xff1a; 系统版本&#xff1a;windows10系统 品牌型号&#xff1a;惠普战66五代 方法/步骤&#x…

C/C++程序的断点调试 - Microsoft Visual Studio

本文以Microsoft Visual Studio为例&#xff0c;简述C/C程序断点调试的基本方法和过程。其它的IDE环境&#xff0c;大同小异。 本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载&#xff0c;但需要注明原作者"海洋饼干叔 叔"&#xff…

【BFS】八数码问题(c++基础算法)

目录 一.读题 二.在做题之前 1.康拓展开 2.DFS和BFS的区别 3.栈和队列的区别 三.做题 1.算法原理 2.算法实现 ①队列 ②康托展开 ③标记 四.AC代码 一.读题 作为最经典的一道宽度优先搜索题&#xff0c;它的题面并不是很难懂。 【宽搜&#xff08;难度&#xff1a;6&a…

爆款短视频拍摄技巧之摇、移、跟拍等,这样拍的视频才更有吸引力,速收藏

爆款短视频拍摄技巧之拍摄手法,这样拍的视频才更有吸引力。 拍摄技巧主要分为两个部分&#xff0c;一个是构图&#xff0c;一个是拍摄手法。上一篇我们聊过了两种构图手法&#xff0c;接下来咱们聊一下拍摄手法&#xff0c;也就是我们常说的推、拉、摇、移、跟这五种手法。 其…

NNDL 2022秋

第一届AI专业&#xff0c;很多课程都是第一次开课&#xff0c;老师和学生都在“摸着石头过河”。 好处是所学内容比较新&#xff0c;跟得上“潮流”&#xff0c;学习意愿比较强。 难处是教学资料相对欠缺&#xff0c;需要学的内容较多&#xff0c;难度较大。 大家经过一学期…