从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 ----> h11
      x22  ---- W1122 ----
      x23  ---- W1123 ----
      x31  ---- W1131 ----
      x32  ---- W1132 ----
      x33  ---- W1133 ----
#第二个输出神经元
      x11  ---- W1211 ----
      x12  ---- W1212 ----
      x13  ---- W1213 ----
      x21  ---- W1221 ----> h12
      x22  ---- W1222 ----
      x23  ---- W1223 ----
      x31  ---- W1231 ----
      x32  ---- W1232 ----
      x33  ---- W1233 ----
#第三个输出神经元
      x11  ---- W2111 ----
      x12  ---- W2112 ----
      x13  ---- W2113 ----
      x21  ---- W2121 ----> h21
      x22  ---- W2122 ----
      x23  ---- W2123 ----
      x31  ---- W2131 ----
      x32  ---- W2132 ----
      x33  ---- W2133 ----
#第四个输出神经元
      x11  ---- W2211 ----
      x12  ---- W2212 ----
      x13  ---- W2213 ----
      x21  ---- W2221 ----> h22
      x22  ---- 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.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

(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]]])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp3步使用goeasy完成本地消息推送

1.注册登录goeasy,下载测试demo 2.替换demo中main.js中的key 3.打包一个H5,一个自定义基座。 h5发消息,app收消息,然后创建消息通知就好了。记得打开app的消息通知 demo很简单,demo都跑通了,在搬到自己项目…

NEJM新英格兰医学期刊文献在家如何查阅下载

今天收到的求助文献中有一篇是NEJM新英格兰医学期刊中的一篇文献,篇名“Osimertinib after Chemoradiotherapy in Stage III EGFR -Mutated NSCLC” 首先我们先简单了解一下NEJM新英格兰医学期刊: NEJM新英格兰医学期刊:New England Journa…

c# - - - winform 右下角气球提示通知

c# - - - winform 右下角气球提示通知 winform 右下角气球提示通知 1.1 winform 右下角气球提示通知 在工具箱中点击 NotifyIcon 控件,拖动到 Form1 窗体上添加这个控件。 在“提示”按钮的点击事件中写气球提示通知内容。 public partial class Form1 : Form {…

如何利用CXL技术突破内存墙?-2

为了解决这些问题,业界正积极寻求新的技术和标准,比如Compute Express Link (CXL),它旨在通过提供标准化的高速互连来提高内存带宽、降低延迟,并简化内存扩展的软件集成,从而有效地打破内存墙的限制。 通过使用CXL&am…

i.MX8MP平台开发分享(RDC资源分配控制器篇)

1.spec RDC 配置信息被发送到结构端口、内存垫片、信号控制器和外设,以根据域分配控制访问。 结构使用与每个端口相关的域标识符,将此信息与总线事务一起包含在内。当从属加密垫圈遇到总线事务时,它会将事务域 ID 与 RDC 提供的允许域列表进…

同一个tomcat不同端口运行不同项目

第一步:修改 server.xml 文件 修改 tomcat 安装目录下 conf/server.xml 文件,需要几个端口就添加几个 Service 节点。 配置 2 个端口:9131 和 9133,于是增加两个 Service 节点。 每个 Service 节点的 name 属性值要设置不同的值…

2024最火爆的6款洗地机推荐,洗地机品质优秀品牌推荐

洗地机将吸尘、拖地、扫地三大功能合一,通过高效吸尘系统迅速吸走灰尘和杂物。内置清洁水箱和智能拖布设计,使其在拖地时能够根据地面材质和清洁需求,自动调节湿度和清洁力度,实现最佳清洁效果。无论是硬地板还是地毯,…

WHAT - 前端开发人员日常提效工具和应用程序

目录 Mac代码编辑器和IDE1. Visual Studio Code (VS Code)2. WebStorm3. VimVim 的优势常用命令:普通模式(Normal Mode)常用命令:插入模式(Insert Mode)常用命令:命令行模式(Command…

接口自动化-预期值和实际值怎么写?

测试类当中 怎么做接口自动化,返回值校验,就是需要返回值的预期值和实际值进行对比 实际值如下 怎么拿到预期值$.msg?用正则表达式-提取值 建新的类-来编写用正则表达式拿到预期值 源码pattern 使用的compile的方法,传入的是字符串正则表…

[原创][Delphi多线程]TThreadedQueue的经典使用案例.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delph…

Spi Pwm Tim 对比分析

spi SPI时序图 (spi是主从机 所以主机需要从机数据 需要主极先喊从机 把从机喊答应了 才能开始读从机的数据) cpol时钟极性 和cpha时钟相位分析 1.cpha为高,cpol为高,则偶数上升沿有效 2.cpha为高,cpol为低,则偶数…

安装Subversion和配置 svn服务端

Subversion是一个免费/开源的版本控制系统(VCS),也被称为SVN。它能够对文件和目录以及它们的修改进行跨时间的管理,允许用户恢复数据的旧版本或检查数据的修改历史。Subversion建立在二进制文件区别算法基础上,对文本和二进制文件都有一致的操作方式,并将它们压缩存放在版…

大容量异步电机直接转矩(DTC)控制matlab仿真

微❤关注“电气仔推送”获得资料(专享优惠) DTC简介 直接转矩控制的基本思想就是利用逆变器所产生的空间电压矢量来控制定子磁链的旋转速度,通过控制定子磁链的走停来改变定子磁链的平均旋转速度的大小,从而改变磁通角的大小进而…

晶圆几何量测系统支持半导体制造工艺量测,保障晶圆制造工艺质量

晶圆面型参数厚度、TTV、BOW、Warp、表面粗糙度、膜厚、等是芯片制造工艺必须考虑的几何形貌参数。其中TTV、BOW、Warp三个参数反映了半导体晶圆的平面度和厚度均匀性,对于芯片制造过程中的多个关键工艺质量有直接影响。 TTV、BOW、WARP对晶圆制造工艺的影响 对…

每日两题 / 198. 打家劫舍 74. 搜索二维矩阵(LeetCode热题100)

198. 打家劫舍 - 力扣(LeetCode) dp[i]表示考虑前i 1号房屋,能获取的最大金额。对于没一间房屋都有偷与不偷两种选择 如果偷,需要从dp[i - 2]转移,因为不能偷窃相邻房屋,dp[i] dp[i - 2] nums[i] 如果…

双指针解题

验证回文数(验证回文数-CSDN博客)和判断在子序列(判断子序列-CSDN博客)已经在之前进行了计算,今天有三个新的双指针问题: 两数之和II—输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0…

国产信创CPU之飞腾CPU剖析

CPU:信创根基,国之重器 国产CPU已形成自主架构、x86、ARM三大阵营。自主阵营中,龙芯、申威分别基于MIPS和Alpha推出loong ISA和SW-64。ARM阵营以鲲鹏、飞腾为代表,利用ARM IP授权开发处理器。x86阵营由海光、兆芯等主导&#xff…

Linux命令 netstat -anp | grep 的用法

文章目录 1、第一种解释2、第二种解释3、第三种解释4、第四种解释5、第五种解释6、netstat --help 在Windows中,杀死端口占用的博客链接 1、第一种解释 在Unix和Linux系统中,netstat -anp 命令用于显示所有的网络连接( -a 表示所有&#xff…

内核宕机自救

【问题】在测试内核级防篡改时,偶尔会遇到内核宕机的问题 【结论】进入紧急救援模式,将服务进程文件的start注释掉,即可 在Linux系统启动时,内核启动顺序选择界面,进入系统欢迎界面按上下左右键进入GRUB界面&#xff…

面试题:说一下 http 报文都有哪些东西?

面试题:说一下 http 报文都有哪些东西? HTTP 是传输超文本(实际上除了 HTML,可以传输任何类型的文件,如视频、音频、文本等)的协议,是一组用于浏览器-服务器之间数据传输的规则。 HTTP 位于 OS…