2.1.卷积层

news2024/11/16 6:55:29

卷积

​ 用MLP处理图片的问题:假设一张图片有12M像素,那么RGB图片就有36M元素,使用大小为100的单隐藏层,模型有3.6B元素,这个数量非常大。

识别模式的两个原则:

  1. 平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。
  2. 局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。

从全连接层到卷积

​ 需要将输入和输出变形为矩阵(宽度,高度),因为现在处理的信息含有空间上的信息

​ 将权重变形为四维张量,从(h,w)到(h’,w’),记录输入图的横纵坐标,对输出图的横纵坐标的影响。
h i , j = b i , j + ∑ k ∑ l w i , j , k , l x k , l = b i , j + ∑ a ∑ b v i , j , a , b x i + a , i + b v 是 w 的重新索引 v i , j , a , b = w i , j , i + a , j + b h_{i,j} = b_{i,j}+\sum_{k}\sum_{l}w_{i,j,k,l}x_{k,l}=b_{i,j}+\sum_{a}\sum_bv_{i,j,a,b}x_{i+a,i+b}\\ v是w的重新索引 v_{i,j,a,b} = w_{i,j,i+a,j+b} hi,j=bi,j+klwi,j,k,lxk,l=bi,j+abvi,j,a,bxi+a,i+bvw的重新索引vi,j,a,b=wi,j,i+a,j+b
​ 索引 a a a b b b通过在正偏移和负偏移之间移动覆盖了整个图像。对于隐藏表示中任意给定位置 ( i , j ) (i,j) (i,j)处的像素值 h i , j h_{i,j} hi,j,可以通过 x x x中以 ( i , j ) (i,j) (i,j)为中心对像素进行加权求和得到,加权使用的权重为 v i , j , a , b v_{i,j,a,b} vi,j,a,b

平移不变性

x x x的平移导致 h h h的平移 h i , j = b i , j + ∑ a ∑ b v i , j , a , b x i + a , i + b h_{i,j}=b_{i,j}+\sum_{a}\sum_bv_{i,j,a,b}x_{i+a,i+b} hi,j=bi,j+abvi,j,a,bxi+a,i+b, v v v应该不依赖于 i , j i,j i,j,它是整张图的权重,则我们可以让 v i , j , a , b = v a , b v_{i,j,a,b}=v_{a,b} vi,j,a,b=va,b,则
h i , j = b i , j + ∑ a ∑ b v a , b x i + a , i + b h_{i,j} =b_{i,j}+\sum_{a}\sum_bv_{a,b}x_{i+a,i+b} hi,j=bi,j+abva,bxi+a,i+b
​ 这就是2维卷积,数学上叫做2维交叉相关

​ 这样的简化让权重矩阵简化了不少

局部性

h i , j = b i , j + ∑ a ∑ b v a , b x i + a , i + b h_{i,j} =b_{i,j}+\sum_{a}\sum_bv_{a,b}x_{i+a,i+b} hi,j=bi,j+abva,bxi+a,i+b

​ 在评估 h i , j h_{i,j} hi,j时,我们不应该用远离 x i , j x_{i,j} xi,j的参数,那么,可以只取一个小范围:

​ 当 ∣ a ∣ , ∣ b ∣ > Δ |a|,|b|>\Delta a,b>Δ时,使得 v a , b = 0 v_{a,b}=0 va,b=0
h i , j = b i , j + ∑ a = − Δ Δ ∑ b = − Δ Δ v a , b x i + a , j + b h_{i,j}= b_{i,j}+\sum^\Delta_{a=-\Delta}\sum^\Delta_{b=-\Delta} v_{a,b}x_{i+a,j+b} hi,j=bi,j+a=ΔΔb=ΔΔva,bxi+a,j+b
对全连接层使用平移不变性和局部性得到了卷积层
h i , j = b i , j + ∑ a ∑ b v i , j , a , b x i + a , i + b ⟹ h i , j = b i , j + ∑ a = − Δ Δ ∑ b = − Δ Δ v a , b x i + a , j + b h_{i,j} =b_{i,j}+\sum_{a}\sum_bv_{i,j,a,b}x_{i+a,i+b} \Longrightarrow h_{i,j}= b_{i,j}+\sum^\Delta_{a=-\Delta}\sum^\Delta_{b=-\Delta} v_{a,b}x_{i+a,j+b} hi,j=bi,j+abvi,j,a,bxi+a,i+bhi,j=bi,j+a=ΔΔb=ΔΔva,bxi+a,j+b

卷积层

二维交叉相关

在这里插入图片描述

​ 对应数字相乘再相加。

二维卷积层

在这里插入图片描述

输入 X : n h × n w X:n_h \times n_w X:nh×nw

W : k h × k w W:k_h \times k _w W:kh×kw

偏差 b ∈ R b\in \R bR

输出 Y : ( n h − k h + 1 ) × ( n w − k w + 1 ) Y:(n_h-k_h+1)\times (n_w-k_w+1) Y:(nhkh+1)×(nwkw+1) (卷积核横向和纵向滑动的次数)
Y = X ⋅ W + b Y =X\cdot W +b Y=XW+b
W W W b b b是可学习的参数

在这里插入图片描述

边缘检测:中间大,周围是负数

由于对称性,交叉相关和卷积在实际使用中没有区别

一维和三维交叉相关

1.一维

y i = ∑ a = 1 h w a x i + 1 y_i = \sum^h_{a=1} w_ax_{i+1} yi=a=1hwaxi+1

​ 文本,语言,时序序列

2.三维


y i , j , k = ∑ a = 1 h ∑ b = 1 w ∑ c = 1 d w a , b , c x i + a , j + b , k + c y_{i,j,k} = \sum ^h _{a=1}\sum^w_{b=1} \sum^d_{c=1} w_{a,b,c} x_{i+a,j+b,k+c} yi,j,k=a=1hb=1wc=1dwa,b,cxi+a,j+b,k+c
​ 视频,医学图像,气象地图

​ 卷积层将输入和核矩阵进行交叉相关,加上偏移后得到输出,核矩阵和偏移是可学习的参数,核矩阵的大小是超参数。

代码实现

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


def corr2d(X, K):  # X是输入矩阵,K是核矩阵 2D卷积
    """计算二维互相关运算"""
    h, w = K.shape
    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]])
Y = corr2d(X, K)
print(Y)

'''卷积层,卷积层在进行互相关运算后,加上偏置产生输出,那么卷积层被训练的参数是卷积核权重和标量偏置'''


class Conv2D(nn.Module):
    def __init__(self, kernel_size):
        super().__init__()
        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  # 前向传播函数调用corr2d并进行偏置


'''将带有h×w卷积核的卷积层称为h×w卷积层'''

# 检测图像中不同颜色的边缘
X = torch.ones((6, 8))
X[:, 2:6] = 0
print(X)
# 如果元素相同,则输出为0,不同则非0
k = torch.tensor([[1.0, -1.0]])
Y = corr2d(X, k)
print('边缘检测结果:\n', Y)

# 这个K只能检测垂直边缘,将X转置后:
Z = corr2d(X.t(), k)
print('垂直边缘检测结果:\n', Z)

'''学习卷积核'''

# 构造一个二维卷积层,它具有1个输出通道和形状为(1,2)的卷积核
conv2d = nn.Conv2d(1, 1, kernel_size=(1, 2), bias=False)

# 这个二维卷积层使用四维输入和输出格式(批量大小、通道、高度、宽度),
# 其中批量大小和通道数都为1


X = X.reshape((1, 1, 6, 8))
Y = Y.reshape((1, 1, 6, 7))
lr = 3e-2  # 学习率

for i in range(10):
    Y_hat = conv2d(X)
    l = (Y_hat - Y) ** 2  # 均方误差
    conv2d.zero_grad()
    l.sum().backward()
    # 迭代卷积核
    conv2d.weight.data[:] -= lr * conv2d.weight.grad
    if (i + 1) % 2 == 0:
        print(f'epoch {i + 1}, loss {l.sum():.3f}')

print("训练结果:", conv2d.weight.data.reshape((1, 2)))

个人理解

​ 卷积的动机是为了减少训练的参数,模式识别的特点(平移不变性,局部性)也保证了这样是合理的。

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

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

相关文章

MySQL学习(15):SQL优化:load、order by、group by

1.大批量插入数据指令load 当需要大批量插入数据时,insert的效率比较低,此时可以使用load命令 使用方法如下: (1)客户端连接服务端时,加上参数--local-infile mysql --local-infile -u root -p&#xf…

Java实现短信验证码服务

1.首先这里使用的是阿里云的短信服务。 package com.wzy.util;; import cn.hutool.captcha.generator.RandomGenerator; import com.aliyun.dysmsapi20170525.Client; import com.wzy.entity.Ali; import org.springframework.stereotype.Component;/*** Author: 顾安* Descri…

2024年铜川宜君半程马拉松,暴晒+爬坡152安全完赛

1、赛事背景 2024年7月21日,我参加了2024年铜川宜君半程马拉松赛,7月举办的赛事很少,全国都算温度比较高的,虽然宜君是一个山城,还是会担心气温会高。 临开赛1、2周,陕西区域降水比较多,赛前一…

C++从入门到起飞之——初始化列表类型转换static成员 全方位剖析!

🌈个人主页:秋风起,再归来~🔥系列专栏:C从入门到起飞 🔖克心守己,律己则安 目录 1、初始化列表 2、 类型转换 3. static成员 4、完结散花 1、初始化列表 • 之前我们实现构造函数…

在Linux中,部署及优化Tomcat

tomcat概述 自 2017 年 11月编程语言排行榜 Java 占比 13%,高居榜首,Tomcat 也一度成为 Java开发人员的首选。其开源、占用系统资源少、跨平台等特性深受广大程序员喜爱。本章主要学习如何部署 Tomcat 服务,根据生产环境实现多个虚拟主机的配置&#xf…

在el-table单元格中通过div绘制圆、直线和对角线

<el-table-column label"电源屏零层端子" align"center" prop"name2" width"220px"><template #default"scope"><div class"bigCircle"></div><div class"smallCircle">…

EtherNet/IP转Profinet协议网关(经典配置案例)

怎么样才能把EtherNet/IP和Profinet网络连接起来呢?这几天有几个朋友问到了这个问题&#xff0c;作者在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题&#xff0c;名为JM-PN-EIP&#xff0c;下面是详细介绍。 一&#xff0c;设备主要功能 1、捷米特J…

eqmx上读取数据处理以后添加到数据库中

目录 定义一些静态变量 定时器事件的处理器 订阅数据的执行器 处理json格式数据和将处理好的数据添加到数据库中 要求和最终效果 总结一下 定义一些静态变量 // 在这里都定义成全局的 一般都定义成静态的private static MqttClient mqttClient; // mqtt客户端 private s…

科研绘图系列:R语言组合堆积图(stacked barplot with multiple groups)

介绍 通常堆积图的X轴表示样本,样本可能会存在较多的分组信息,通过组合堆积图和样本标签分组信息,我们可以得到一张能展示更多信息的可发表图形。 加载R包 knitr::opts_chunk$set(warning = F, message = F) library(tidyverse) library(cowplot) library(patchwork)导入…

R包:plot1cell单细胞可视化包

介绍 plot1cell是用于单细胞数据seurat数据对象的可视化包。 安装 ## You might need to install the dependencies below if they are not available in your R library. bioc.packages <- c("biomaRt","GenomeInfoDb","EnsDb.Hsapiens.v86&qu…

基于飞腾FT2000的嵌入式计算机系统

作为中国嵌入式计算机的领导厂家&#xff0c;是最早进入轨道交通领域的 工业级AFC嵌入式计算机系列产品&#xff0c;充分体现了轨道交通新一代AFC主流新技术的各种特点&#xff0c;为轨道交通AFC系统的升级换代提供了良好的系统平台。 标准化 采用开放式架构的Intel新一代主流…

力扣高频SQL 50题(基础版)第八题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第八题1581. 进店却未进行过交易的顾客题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图&#xff1a;总结&#xff1a; 力扣高频SQL 50题&#xff08;基础版&#xff09;第八题 1581. 进店…

操作系统杂项(十)

目录 一、简述socket中select、epoll的使用场景和区别 1、使用场景 2、区别 二、epoll水平触发和边缘触发的区别 三、简述Reactor和Proactor模式 1、Reactor 2、Proactor 3、区别 四、简述同步和异步的区别&#xff0c;阻塞和非阻塞的区别 1、同步与异步 2、阻塞与非…

SpringBoot入门:如何新建SpringBoot项目(保姆级教程)

在本文中&#xff0c;我们将演示如何新建一个基本的 Spring Boot 项目。写这篇文章的时候我还是很惊讶的&#xff0c;因为我发现有些java的初学者&#xff0c;甚至工作10年的老员工居然并不会新建一个SpringBoot项目&#xff0c;所以特别出了一篇文章来教大家新建一个SpringBoo…

状态机 XState 使用

状态机 一般指的是有限状态机&#xff08;Finite State Machine&#xff0c;FSM&#xff09;&#xff0c;又可以称为有限状态自动机&#xff08;Finite State Automation&#xff0c;FSA&#xff09;&#xff0c;简称状态机&#xff0c;它是一个数学模型&#xff0c;表示有限个…

Java链接elasticsearch8.14.1

项目需求&#xff0c;需要实现海量数据的聚合、查询。因为职业生涯开发使用springboot微服务架构、Java开发的方式&#xff0c;所以&#xff0c;项目前期准备了elasticsearch、kibana、logstash的集群环境&#xff0c;作为服务端&#xff0c;用于数据的收集、存储&#xff1b;但…

masscan 端口扫描——(Golang 简单使用总结)

1. 前言 最近要做一个扫描 ip 端口的功能 扫描的工具有很多&#xff0c;但是如何做到短时间扫描大量的 ip 是个相对困难的事情。 市场上比较出名的工具有 masscan和nmap masscan 支持异步扫描&#xff0c;对多线程的利用很好&#xff0c;同时仅仅支持 syn 半开扫描&#xff…

Emacs之解决无法输入中文问题(一百四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

研究生选择学习Android开发的利与弊?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Android的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;产品经理可以学学Axure快…

ForCloud赢战攻防 无惧突发0day漏洞 ForCloud虚实结合快速处置

攻防演练前夕&#xff0c;亚信安全威胁情报中心监测到一个存在于Nacos Derby中的0day漏洞&#xff0c;漏洞利用代码为公开状态&#xff0c;攻击者利用此漏洞可在目标服务器上执行任意代码。 造成的破坏程度&#xff1f;你可能正在使用&#xff01; Nacos&#xff08;Dynamic …