FEDformer 代码分析(1)

news2025/1/17 13:39:14

参数设置如下,

--seq_len  是 96

--label_len 是 48

--pred_len 是 96

也就是说,输入是96的,预测96.

batch_x 是 (1,96,7)的维度的。

batch_x_mark 是(1,96,4)的维度的。

batch_y的维度是(1,144,7)的维度的。

batch_y_mark的维度是(1,144,4)的维度的。

然后,decoder的维度是, (1,96,7)的维度的,全都是0的元素。

 然后变成了(1,144,7)的维度,下面都是(1,96,7)的0元素。

为什么会有这种情况?

来看FEDformer的preliminary:

也就是说encoder的输入的尺寸是1,96,4,也就是输入是96的长度的。

而,decoder的输入的尺寸是输出的尺寸加上输入的一半的尺寸,也就是这些。96/2 + 96 = 144的尺寸的。 

也就是,生成了一个和预测长度一样尺寸的东西。全都是0。

 然后,他的输入又cat了一个新的东西,

这个新的东西是输入的一半的维度。

 然后就进入到了模型里面,

第一步是生成一个mean,这个mean是基于x_enc生成的。

这个mean的意义是什么?

假设一个tensor的维度是(1,2,3),第二个维度是(1,2,3)(1,2,3),在dim=1上求平均,得出来的结果是1,2,3。

那么,在x_enc上求平均的结果就是在,(1,96,7)在96这个维度上求,

再看看这个维度,如果对于(1,2,3)这个维度的tensor求mean,在2这个维度上求,得出来的结果就是(1,3)的维度的。 

那么,类比我们这个输入的向量,他是(1,96,7)的维度的tensor。

那么他的mean,就是(1,7)的维度的。需要repeat96遍。

这个的意义就是,好比输入是这样的

1,2,3,4,5,6,7;

1,2,3,4,5,6,7;

1,2,3,4,5,6,7;

1,2,3,4,5,6,7;

。。。

1,2,3,4,5,6,7;重复96个,也就是输入长度的96长度,对于这个长度每一个feature点都求mean。

 生成了两个tensor,都是(1,96,7)的维度的。

 然后把x_enc扔到这个decomp里面能够得到两个东西,这两个东西主要就是创新的需要学习的东西。

我们记住这个x_enc的尺寸,是(1,96,7)的维度。

 这个series_decomp_multi的里面有两个可学习的东西,一个是一个pooling,是kernel_size是24的大小的,另一个是一个linear,是一个1in,1out的。

 这个moving_average看他的注释的意思是说,这个模块的功能是在强调时间序列的趋势。

可以看出,两个红色的东西,是通过x来分离出来的,

一个是(1,11,7)维度的,一个是(1,12,7)维度的。 

而cat后的,x的维度是变大了的。

然后再通过avg进行池化。可以看到这个池化所进行的维度是变化了的。很显然这个部分是有操作的。

我们举个例子理解一下,

利用unsqueeze这个操作来使得这个,[1,2,3,4,5,6,7]的向量变成一个,(1,96,7)的向量。

然后我们开始下面的实例操作, 

floor的意思是,返回一个小于等于这个数字的最大整数。 

红色的地方是,也就是把这个x的向量的所有的第二个维度的第一个分量得到

也就是说,如果batch_size = 16的话,那么这里的,这个x的这个操作的维度,

就是(16,1,7)也就是仅仅截取第一个地方的量。 

然后,这个会重复后面的这个的次数,

 也就是说,他会重复12次,也就是说,这个操作的意思是,把所有batch里面的所有的单个unit的第一个time_stamp,也就是说本来这个序列的输入是

(batchsize,sequence_length,feature_map)的,

然后重复12次,是取这个sequence_length的第一个进行重复了12次,

 front就是将第一个维度重复这么多次,到最后变成了(1,12,7)的东西。

这个东西是从(1,96,7)里面操作出来的。也就是把(1,96,7)的第一个(1,1,7)重复了12次,然后得到了这个(1,12,7)这个东西。

这个end好像也是类似的操作,我们看一下他是怎么回事。

 看下,这个红色部分前面的操作,也是和第一个类似,他是把最后一个序列点取到。

 然后,这个x是用x和得到的front和end进行cat,他的维度是(1,119,7)的维度的。

也就是说,加上这个11和12后是这个维度的。也就是说加上23维度的才是这个维度的,也就是本来的x是(1,96,7)的维度的,前面拼接上front,后面拼接上end后,变成了(1,119,7)这个维度的了。

然后接下来就是会对这个得到的新的拼接向量做pooling,来看看他是怎么pooling的。

 这个pooling的详细的参数是,kernel_size是24,步长是1。

 然后,在这个时间戳上做pooling,这个是有意义的。

因为一开始定义的一个戳就是1234567,也就是一个时间点上他拓展为7个单位的feature。

而,现在permute后, 是在这个1,2,3,4,5,6,7上做pooling,也就是说,是对于119这个时间戳的单位来说做pooling。因为这个pooling的大小是24,所以,119-96是一个pooling,97,98,99,100,101,...,119这是23个,所以第一个pooling的单位是96-119这个范围做pooling。

这一步的意思并不是很懂,他的kernel的大小是24,前后都要填充上,这个操作并不是特别能理解。

1-12,1-12,也就是 第一个stride是在做这个pooling,

2-12,1-13,第二个stride是在做这个pooling,

3-12,1-14,第三个stride是在做这个pooling,

4-12,1-15,第四个stride是在做这个pooling。

我们对比一下不加cat的做法,

1-24,

2-25,

3-26,

4-27.

很明显的一个区别就是,上述的这个做法,1这个东西,也就是1这个序列点,在pooling的时候存在了很久,很明显会存在12步,因为他前面有12个点stride是1。利用这种做法,所以每一个点都会在序列中存在很长一段时间。这个做法应该就是顾虑这个问题。

 然后我们来回过头来看这个moving_avg是把x进入后加了一个前一个后,然后做池化,加前和后的目的是为了使得每个序列点都能够充分地做pooling。

 到了上面这一步,这个moving_mean这个列表的意思是存取这通过上面的pooling得到的新的x。

这个unsqueeze后的moving_avg的维度是上面这样的。也就是说这个列表里面存的都是这个样子的。 

我们测试一下这个操作,cat后,这个里面的东西是这个维度的,那么如果我们里面不止有一个呢?他会是什么样的效果呢?

 

我们发现,他里面的东西就有两个了。 

 我们发现,他是这个维度的。

 然后经过绿色的这个操作,里面的东西又变成恶了(1,96,7)这个维度的了。

我们来看看绿色的这个东西是有什么效果,

最外面的操作是在dim-1上对mean,进行求和。

 x的维度是(1,96,7)。

然后,x.unsqueeze(-1),后的维度就是(1,96,7,1)这个维度。 

 这里可以看到,通过layer后的这个tensor,就是对他每一个点进行了一个learning。

 经过softmax后的是这个,然后再乘moving_mean。

总结一下,这个整体的操作如下。

 

然后到最后返回了两个东西,

一个是res,也就是利用x-moving_mean。 

另一个是moving_mean,也就是利用对x的pooling所得到的东西。

然后到了最外面的模型的层面,

一个是seasonal_init,也就是上面说的用x - moving_mean,

另一个是trend_init,也就是上面的moving_mean的东西。

这两个都是和输入 一个尺寸的 ,也就是(1,96,7)这个维度的东西。

然后到模型的层面,他是用trend_init这个东西,也就是moving_mean这个东西进行和mean,进行交互,这个mean这个东西是利用x_enc得到的。上面写了这个mean的意义,现在又忘了。我们回过头来重新探讨一下。 

输入的x_enc的维度是(1,96,7)这个维度的, 

对这个96这个维度求均值,dim=1,也就是输出的mean是(1,7)

也就是

1,2,3,4,5,6,7这样的序列条有96个,

然后对第一个feature点求mean,第二个feature点求mean这样。 

所以才得到了(1,7)的维度的tensor。

也就是说,这个mean是这个输入序列的每一个feature点的均值,然后repeat了几十遍。

这个绿色的部分是(1,48,7)的维度的。

这个红色的是(1,96,7)的维度的。

因此,得到的trend_init的向量是(1,144,7)的维度的。

然后这里做了一个pad,这个pad也需要仔细研究一下的。这个原来的东西,

 也就是这个红色的东西,他的维度是(1,48,7)的维度的,也就是这个x-moving的前一半。

然后对他做了pad。他变成了,(1,144,7)的维度的东西。下面的都是0,只有前面的才是sesonal的东西。

 

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

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

相关文章

嵌入式系统开发笔记107:层次化软件设计思想

文章目录前言一、嵌入式系统设计的本质二、基于寄存器结构的程序设计三、嵌入式系统优良程序的评判标准四、计算机上的软件分层五、嵌入式程序的分层设计前言 本文以思维导图的形式介绍层次化软件设计思想。 一、嵌入式系统设计的本质 二、基于寄存器结构的程序设计 三、嵌入式…

Java 内存溢出(一)原因、复现、排查

目录一、内存溢出原因二、内存溢出实例1、堆溢出2.虚拟机栈和本地方法栈溢出3.方法区和运行时常量池溢出4.本机直接内存溢出三、内存溢出排查内存溢出: 是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供…

[附源码]计算机毕业设计JAVA基于新高考模式下的排课系统

[附源码]计算机毕业设计JAVA基于新高考模式下的排课系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: S…

强化学习论文分析5---多基站_强化学习_联邦学习_计算卸载

目录一、文章概述二、理论模型1.系统目标2.约束条件3.公式推导(1)任务量(2)卸载率(3)本地能耗(4)传输能耗(5)MEC计算能耗(6)总述三、算法架构----多基站联合强化学习1.网络结构图2.算法总述3.Actor网络(1).输入状态(2).输出动作4.Critic网络(1).环境奖励5.伪代码四、算法架构--…

信号线多长算长呢——之上升沿与时延的爱恨情仇

忆往昔岁月,看着PCB上弯弯曲曲的走线,看着书中所说的端接,想象着日后自己也可以这么牛逼,能够设计出这么复杂的电路。“过来焊板子啦”一句话又将我拉回了现实,哎,过来吸一会我们硬件攻城狮的精神鸦片——松…

实验四 软中断信号及处理

1.利用sleep、pause、alarm函数设定闹钟&#xff0c;定时显示信息。 #include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<signal.h> int main(){int ret;alarm(50);sleep(30);retalarm(10);printf("%d\n",ret);pause();pri…

C++11

1. C11简介 相比于 C98/03&#xff0c;C11则带来了数量可观的变化&#xff0c;其中包含了约140个新特性&#xff0c;以及C03标准中约600个缺陷的修正&#xff0c;这使得C11更像是从C98/03中孕育出的一种新语言。相比较而言&#xff0c;C11能更好地用于系统开发和库开发、语法更…

玩机搞机---脱离电脑 用手机给手机刷机 解锁bl 获取root的方法教程

友友们有时候手机出问题需要刷机而手头缺没有电脑的情况下该如何解决呢&#xff0c;今天的话题就聊聊 这方面的常识。其实类似手机给手机刷机的方法有很多&#xff0c;但原理都是一样的&#xff0c;有时候可以起到应急解决方法&#xff0c; 一 需要的工具与准备工作; 手机A …

长尾词挖掘免费工具-长尾关键词挖掘词

什么是关键词&#xff1f;在 SEO&#xff0c;搜索引擎优化的范畴里&#xff0c;关键词指的是用户输入到搜索框内的那一个&#xff0c;或者几个词&#xff0c;目的是为了找到他要的答案。搜索引擎收到用户发送的这几个词&#xff0c;或者说关键词后&#xff0c;就会试图找到最合…

同惠TH9310耐压测试仪应用举例

TH9310交直流耐压绝缘测试仪是一款小功率经济型智能安规测试仪器。体积小、重量轻、外形美观、操作简便。TH9320产品可广泛应用于家用电器、变压器、电气设备、元器件的安全性能检查。 应用举例&#xff1a; ■ 自动化测试系统 ■ 家用电器 ■ 变压器、电机 ■ 电气设备 …

Postman高频面试题及答案汇总(接口测试必备)

Postman在软件测试的面试中&#xff0c;可以说是必考题了&#xff0c;既然是高频考题&#xff0c;当然得为粉丝宝宝们整理一波题库喽~ 一、Postman在工作中使用流程是什么样的&#xff1f; 二、你使用过Postman的哪些功能&#xff1f; 三、Postman如何管理测试环境&#xff…

【改进灰狼优化算法】基于协调探索和开发能力的改进灰狼优化算法求解单目标优化问题(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

1.QML Hello world

目录1. 如何显示HelloWorld&#xff1f;2. QML工程如何创建&#xff1f;3. QML HelloWorld工程里有什么文件&#xff1f;1. 如何显示HelloWorld&#xff1f; 本系列文章基于Windows11Qt6.3&#xff0c;GUI开发第一步&#xff0c;显示一个Hello world。 import QtQuick //Qt5 需…

数据结构与算法是什么?

人们常说&#xff1a; 程序 数据结构 算法 当遇到一个问题&#xff0c;或者有一个需求时&#xff0c;要设计程序来解决问题&#xff0c;重要的一步就是设计算法&#xff0c;并选择或者说设计相应数据结构来实现算法。 一、数据结构 数据结构在问题解决中主要用来&#xf…

第一章三层交换应用

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。个人爱好: 编程&#xff0c;打篮球&#xff0c;计算机知识个人名言&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石…

CSS的选择器(超详细)

目录 一、常用的选择器 1.元素选择器 2.类选择器(class选择器) 3.id选择器 4.通配符选择器 二、群组选择器 三、关系选择器 1.后代选择器 2.子代选择器 3.相邻兄弟选择器 4.通用兄弟选择器 5.案例 四、属性选择器 五、伪类选择器 1.常用的伪类选择器 2.否定伪类 3.元…

智慧农业大数据平台:农业中的“大智慧”

智慧农业是现代化农业发展的重要途径&#xff0c;是利用物联网等现代信息技术提升农业生产管理水平&#xff0c;实现传统农业转型升级的重要措施。近年来&#xff0c;我国食品安全问题频发&#xff0c;究其根本原因&#xff0c;既有商家过度逐利的过错&#xff0c;也有农产品在…

MySQL 不相关子查询怎么执行?

1. 概述 从现存的子查询执行策略来看&#xff0c;半连接 (Semijoin) 加入之前&#xff0c;不相关子查询有两种执行策略&#xff1a; 策略 1&#xff0c;子查询物化&#xff0c;也就是把子查询的执行结果存入临时表&#xff0c;这个临时表叫作物化表。 explain select_type …

Linux: network: tcp_rmem/rmem_default

文章目录tcp_rmem - 取值是&#xff1a;3个整数向量: min, default, maxmindefault&#xff1a;maxrmem_defaultrmem_max具体的用法相关的方法tcp_rmem - 取值是&#xff1a;3个整数向量: min, default, max min TCP sockets使用的最小接收缓存大小。这个最小值的作用是在&am…

PowerPC平台移植RTL8822BU

目录编译驱动文件修改Makefile修改代码安装前置工具编译openssl编译libnl解决报错编译wpa_supplicant解决报错编译hostapd移植入嵌入式编译驱动文件 修改Makefile 修改代码 由于我这边kernel用的是比较老的&#xff0c;有些接口不支持&#xff0c;所以需要做一些处理 关于is…