从MLP到卷积

1.从MLP到卷积层

最近要做多通道的实验,所以重新将处理图像的基础模型回顾一下,什么是卷积?卷积本质是是一种特殊的全连接层。

 1.1怎么w的权重从一个值变成了4维呢?可以这样理解,在此举一个例子:

其实本质可以看成,将w的权重从一个值拉成了一个向量,ij就是宽与高,对应的向量就是具体的元素值,我们在这里假设w形状为2*2*3*3.这个怎么理解四维张量呢?2是两个批次,

对于输入矩阵和输出矩阵的维度,以及四维张量权重的形状,可以用一个具体的示例来说明它们之间的关系。

示例设定

  • 输入矩阵 𝑋X 大小为 3×3。
  • 输出矩阵 𝐻H 大小为 2×2。
  • 权重张量 𝑊W 形状为 2×2×3×3

#第一个输出神经元x11  ---- W1111 ----x12  ---- W1112 ----x13  ---- W1113 ----x21  ---- W1121 ----> h11x22  ---- W1122 ----x23  ---- W1123 ----x31  ---- W1131 ----x32  ---- W1132 ----x33  ---- W1133 ----
#第二个输出神经元x11  ---- W1211 ----x12  ---- W1212 ----x13  ---- W1213 ----x21  ---- W1221 ----> h12x22  ---- W1222 ----x23  ---- W1223 ----x31  ---- W1231 ----x32  ---- W1232 ----x33  ---- W1233 ----
#第三个输出神经元x11  ---- W2111 ----x12  ---- W2112 ----x13  ---- W2113 ----x21  ---- W2121 ----> h21x22  ---- W2122 ----x23  ---- W2123 ----x31  ---- W2131 ----x32  ---- W2132 ----x33  ---- W2133 ----
#第四个输出神经元x11  ---- W2211 ----x12  ---- W2212 ----x13  ---- W2213 ----x21  ---- W2221 ----> h22x22  ---- W2222 ----x23  ---- W2223 ----x31  ---- W2231 ----x32  ---- W2232 ----x33  ---- W2233 ----

这个对应的是输出。也就是2*2的一个输出。2*2*3*3前者是输出的维度,后者是输入的维度。其实权重就是把w原先的1维变成了矩阵,每个都对应相乘了。这个是mlp和卷积的关系。卷积是一种特殊的mlp。所以一般的卷积是什么呢?

一般的卷积满足下面两个性质:

(1)平移不变性

(2)局部性

给一个图和一个卷积核的定义就能理解了:在这里卷积核就是3*3了,平移确实没有变化卷积核,卷积核就是权重矩阵,局部性就是每个卷积核就那么大,滚来滚去还是那么大。

1.2怎么理解卷积呢?

1.3多个输入与输出通道

一个自己写的例子:

多对一

import torch
from d2l import torch as d2l
import numpy as np
def corr2d_multi_in(X,K):return sum(d2l.corr2d(x,k) for x,k in zip(X,K))
X = torch.tensor([[[0,1,2],[3,4,5],[6,7,8]],[[1,2,3],[4,5,6],[7,8,9]],[[2,3,4],[5,6,7],[8,9,10]]])K = torch.tensor([[[0,1],[2,3]],[[1,2],[3,4]],[[5,6],[7,8]]])
print(corr2d_multi_in(X,K))

这个怎么理解呢?就是三个卷积核对应着三个不同的通道。

结果如下最后要将三个卷积核计算的结果进行相加。sum三个卷积核。

多对多(多通道输入及多通道输出):

老样子,我还是举个例子:

(1)定义输入和卷积核

import torch# 定义输入张量 X
X = torch.tensor([[[0, 1, 2], [3, 4, 5], [6, 7, 8]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]])# 定义原始卷积核 K
K = torch.tensor([[[0, 1], [2, 3]], [[1, 2], [3, 4]]])# 扩展 K
K = torch.stack((K, K + 1, K + 2), 0)

(2)扩展后的卷积核

K = torch.stack((K, K+1, K+2), 0)# 结果
K = tensor([[[[0, 1], [2, 3]],  # 第一个卷积核[[1, 2], [3, 4]]], [[[1, 2], [3, 4]],  # 第二个卷积核 (K+1)[[2, 3], [4, 5]]], [[[2, 3], [4, 5]],  # 第三个卷积核 (K+2)[[3, 4], [5, 6]]]])

(3)定义二维卷积函数

def corr2d(X, K):h, w = K.shapeY = 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

(4)多通道输入二维卷积函数

def corr2d_multi_in(X, K):return sum(corr2d(x, k) for x, k in zip(X, K))

(5)最终多输入多输出的卷积函数

def corr2d_multi_in_out(X, K):return torch.stack([corr2d_multi_in(X, k) for k in K], 0)

(6)调用并打印结果

result = corr2d_multi_in_out(X, K)
print(result)

给出结果:

(1)第一个卷积核 k = K[0]:

k = tensor([[[0, 1], [2, 3]], [[1, 2], [3, 4]]])

(2)对第一个通道:

x = X[0] = tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
k[0] = tensor([[0, 1], [2, 3]])result = corr2d(x, k[0])
# result: tensor([[19, 25], [37, 43]])

(3)对第二个通道:

x = X[1] = tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
k[1] = tensor([[1, 2], [3, 4]])result = corr2d(x, k[1])
# result: tensor([[42, 52], [72, 82]])

(4)两个通道结果相加:

total_result = tensor([[19, 25], [37, 43]]) + tensor([[42, 52], [72, 82]])
# total_result: tensor([[ 61,  77], [109, 125]])

(5)第二个卷积核 k = K[1]:

k = tensor([[[1, 2], [3, 4]], [[2, 3], [4, 5]]])

(6)对第一个通道:

x = X[0] = tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
k[0] = tensor([[1, 2], [3, 4]])result = corr2d(x, k[0])
# result: tensor([[39, 49], [69, 79]])

(7)对于第二个通道

x = X[1] = tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
k[1] = tensor([[2, 3], [4, 5]])result = corr2d(x, k[1])
# result: tensor([[64, 79], [109, 124]])

(8)两个通道结果相加:

total_result = tensor([[39, 49], [69, 79]]) + tensor([[64, 79], [109, 124]])
# total_result: tensor([[103, 128], [178, 203]])

(9)第三个卷积核 k = K[2]:

k = tensor([[[2, 3], [4, 5]], [[3, 4], [5, 6]]])

(10)对第一个通道:

x = X[0] = tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
k[0] = tensor([[2, 3], [4, 5]])result = corr2d(x, k[0])
# result: tensor([[59, 73], [101, 115]])

(11)对第二个通道:

x = X[1] = tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
k[1] = tensor([[3, 4], [5, 6]])result = corr2d(x, k[1])
# result: tensor([[86, 106], [146, 166]])

(12)两个通道结果相加:

total_result = tensor([[59, 73], [101, 115]]) + tensor([[86, 106], [146, 166]])
# total_result: tensor([[145, 179], [247, 281]])

(13)堆叠所有结果

final_result = torch.stack([tensor([[ 61,  77], [109, 125]]),tensor([[103, 128], [178, 203]]),tensor([[145, 179], [247, 281]])], 0)# final_result:
# tensor([[[ 61,  77],
#          [109, 125]],#         [[103, 128],
#          [178, 203]],#         [[145, 179],
#          [247, 281]]])

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

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

相关文章

签名安全规范:解决【请求对象json序列化时,时间字段被强制转换成时间戳的问题】

文章目录 引言I 签名安全规范1.1 签名生成的通用步骤1.2 签名运算(加密规则)1.3 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)1.4 允许的请求头字段1.5 签名校验工具II 注解校验签名2.1 获取请求数据,并校验签名数据2.2 解决时间格式被强制转换成时间戳的问题…

6.5 比赛设备独家揭秘 | 2024高通边缘智能创新应用大赛公开课

2024高通边缘智能创新应用大赛系列公开课热度不减,第三期即将火爆开启,广翼智联FV01边缘智能物联网开发板迎来赛程期间首次公开亮相! 在这期的直播中,广翼智联高级产品市场经理伍理化将亲自担任主讲,为大家一一揭晓这…

探索大模型技术及其前沿应用——TextIn文档解析技术

前言 中国图象图形大会(CCIG 2024)于近期在西安召开,此次大会将面向开放创新、交叉融合的发展趋势,为图像图形相关领域的专家学者和产业界同仁,搭建一个展示创新成果、展望未来发展,集高度、深度、广度三位…

37、Flink 的 WindowAssigner之会话窗口示例

1、处理时间 无需设置水位线和时间间隔。 input.keyBy(e -> e).window(ProcessingTimeSessionWindows.withGap(Time.minutes(10))).apply(new WindowFunction<String, String, String, TimeWindow>() {Overridepublic void apply(String s, TimeWindow timeWindow, I…

探索气象数据的多维度三维可视化:PM2.5、风速与高度分析

探索气象数据的多维度可视化&#xff1a;PM2.5、风速与高度分析 摘要 在现代气象学中&#xff0c;数据可视化是理解复杂气象模式和趋势的关键工具。本文将介绍一种先进的数据可视化技术&#xff0c;它能够将PM2.5浓度、风速和高度等多维度数据以直观和动态的方式展现出来。 …

ChatTTS 如何安装可视化操作

可视化一键安装下载地址&#xff1a; 百度网盘 Download from GitHub 从 GitHub 下载代码。 git clone https://github.com/2noise/ChatTTS 下载地址 Install Dependencies 在开始之前&#xff0c;请确保已安装必要的软件包。如果您尚未安装它们&#xff0c;可以使用 pip …

Android百度人脸识别3.0配置

JDK 必须是16的版本 如果报错的错误是"opens java.io" org.gradle.jvmargs -Xmx2048M -Dkotlin.daemon.jvm.options\"-Xmx2048M" --add-exportsjava.base/sun.nio.chALL-UNNAMED --add-opensjava.base/java.langALL-UNNAMED --add-opensjava.base/java.…

智能售货机投资指南:从成本预算到市场策略的全方位解析

现代化智能设施的典范&#xff0c;智能售货机以其丰富的商品选项与无缝购物体验著称。然而&#xff0c;涉足此领域前&#xff0c;一番周密的投资考量不可或缺。 首要因素聚焦于售货机本身的购置费用&#xff0c;该费用弹性颇大&#xff0c;依据型号与功能差异而定。基础的小型…

Linux 36.3 + JetPack v6.0@jetson-inference之语义分割

Linux 36.3 JetPack v6.0jetson-inference之语义分割 1. 源由2. segNet2.1 命令选项2.2 下载模型2.2.1 Cityscapes2.2.2 DeepScene2.2.3 MHP2.2.4 VOC2.2.5 SUN 2.3 操作示例2.3.1 单张照片2.3.2 多张照片2.3.3 视频 3. 代码3.1 Python3.2 C 4. 参考资料 1. 源由 分类和目标识…

Docker面试整理-Docker的核心组件是什么?

Docker 的核心组件构成了它的基本架构,使其能够高效地进行容器化部署和管理。这些组件协同工作,为开发者和系统管理员提供了一个强大的工具集,用于构建、分发和运行容器。主要的核心组件包括: Docker 客户端和服务器(Docker Engine):Docker 客户端(Client)允许用户通过…

【Unity】使用Jenkins实现远程Unity打包

前言 很多时候&#xff0c;我们需要自动打包&#xff0c;比如下班了&#xff0c;我要出一个包明天早上用。比如每天夜里12点&#xff0c;我需要定时出一个稳定包。 这个时候就需要Jenkins了。 1.安装环境 安装 jenkins 之前&#xff0c;需要安装Java 。Java下载网站 ①下载…

揭秘大数据时代的数据库存储引擎:关系型、NoSQL与NewSQL如何选择?

文章目录 01 关系型数据库&NoSQL数据库&NewSQL数据库1. 关系型数据库2. NoSQL数据库3. NewSQL数据库 02 OLTP&OLAP&HTAP对比1. OLTP数据库2. OLAP数据库3. HTAP数据库 03 总结 在大数据和AI时代&#xff0c;数据库成为各类应用不可或缺的重要组成部分。而数据库…

数据湖构建基础:高效数据提取与存储策略

随着大数据技术的快速发展&#xff0c;企业对于数据处理和分析的需求日益增加。数据湖作为一种集中式存储和处理大规模数据的架构&#xff0c;已经成为企业处理非结构化和半结构化数据的重要工具。然而&#xff0c;构建一个高效、稳定的数据湖并非易事&#xff0c;其中高效的数…

JDK参数设置中文版

java最新JDK参数设置 行为选项Garbage First&#xff08;G1&#xff09;垃圾收集选项性能选项调试选项 行为选项 选项默认值描述-XX:-AllowUserSignalHandlers未设置如果应用程序安装了信号处理程序&#xff0c;不要抱怨。&#xff08;仅适用于 Solaris 和 Linux。&#xff09…

2024年生物、农业与工程技术国际会议(BAET 2024)

2024年生物、农业与工程技术国际会议&#xff08;BAET 2024&#xff09; 2024 International Conference on Biology, Agriculture, and Engineering Technology 目录 【会议简介】2024年生物、农业与工程技术国际会议将于昆明盛大召开。此次会议汇聚了全球生物、农业与工程技…

网络编程(一)

网络编程&#xff08;一&#xff09; 网络基础网络体系结构**OSI的7层模型**&#xff1a;&#xff08;理想化&#xff09;**每层的功能** **TCP/IP的4层模型**&#xff1a;&#xff08;在使用&#xff09;常见的协议IP地址IPV4分类A类&#xff08;第1位固定为0&#xff09;B类&…

「前端+鸿蒙」核心技术HTML5+CSS3(十二)

1、CSS3 伸缩盒模型简介 CSS3 的 Flexbox(伸缩盒)模型是一种布局模式,用于在容器内对齐和分配空间,即使它们的大小未知或动态变化。Flexbox 使得布局能够适应不同屏幕尺寸和设备。 示例代码: <div class="flex-container"><div>项目1</div>…

大文件续传,文件分享

1. 最近各种文件分享平台&#xff0c;很多都要注册&#xff0c; 对于很多需要临时分享文件下的场景&#xff0c;不想被这种东西烦恼&#xff0c;于是借鉴网上代码&#xff0c;进行了一些修改&#xff0c; 写了一个文件分享项目&#xff0c; 该项目只是自用&#xff0c;数据库都…

为何使用代理池:

匿名性&#xff1a; 代理池允许爬虫在请求目标网站时使用不同的IP地址&#xff0c;从而保护真实身份。 防封锁&#xff1a; 通过动态切换IP&#xff0c;可以规避网站对特定IP的封锁&#xff0c;提高爬虫的稳定性。 分布式请求&#xff1a; 代理池使爬虫能够通过多个IP地址发起…

go语言接口之接口类型

接口类型具体描述了一系列方法的集合&#xff0c;一个实现了这些方法的具体类型是这个接口类型的 实例。 io.Writer类型是用的最广泛的接口之一&#xff0c;因为它提供了所有的类型写入bytes的抽象&#xff0c;包括文 件类型&#xff0c;内存缓冲区&#xff0c;网络链接&#x…