第六周周报

摘要

本周重点跟着网课学习了pytorch框架下张量的各种常用操作API,为后面跑模型做准备,因为看的视频比较偏向原理,现在对张量有了一个新的认识。其次在时序的研究上,最近我在看图神经网络跟时序结合的方向,所以本周学习了GNN模型以及跟时间序列结合的方式有哪些。

This week’s focus was on learning various common tensor manipulation APIs under the PyTorch framework through online courses, in preparation for running models in the future. Since the videos I watched were more theoretical, I now have a new understanding of tensors. In addition, in my study of time series, I have recently been exploring the combination of graph neural networks (GNN) with time series data, so this week I learned about GNN models and different ways to combine them with time series.

时序知识学习

GNN与时序

GNN解决什么问题?

上学期学习的CNN、RNN之类的模型对于图像,文字之类的欧几里得数据可以进行很好的处理。**欧几里得数据:**存在于N维欧氏空间的东西,比如2维表格里面的数据,再比如CNN经常做的RGB图像数据是3维数据(h*w*c)。

然而我们的现实世界更多的是非欧几里得数据,比如交通网、社交网络、污染物扩散,这种难以排序,没有坐标参考点,难以用矩阵或张量表示的数据就无法用CNN、RNN之类模型,而GNN这种模型特点就是用来处理这种非欧几里得数据,它以图为输入,输出各种下游任务的预测结果,比如:

  • 节点分类:预测某一节点的类型

  • 边的预测:另一种使用GNN的方法是找到可以为图形增加价值的新边。以社交网络为例,GNN可以找到在嵌入空间中与某人关系密切但还不是朋友的用户(节点)(也就是没有将他彼此联系起来的边),然后可以将这些用户作为朋友推荐介绍给他。

  • 聚类:识别密集连接的节点形成的簇。

图这部分在数据结构中已经学习过了所以没有详细看,这部分我主要看图是以什么形式进行输入。在数据结构中,图的表示方式有两种,一种是领接矩阵一种是领接列表,在数据结构中,图用领接矩阵来表示的话,内存占用特别大O(n的平方),而且领接矩阵表示的图通常很稀疏,领接列表的话可以大幅减少空间的消耗,在某些场景中可能比较有用,一般还是用领接矩阵多。理由如下:

  • 领接矩阵是方阵:可以通过矩阵运算对节点进行聚合、信息传递等操作,这使得 GNN 能够有效地处理大规模的图数据。

  • 稀疏性:对于大多数实际的图数据来说,它们的领接矩阵通常是稀疏的,即只有很少的边连接了大量的节点。这种稀疏性可以通过优化算法来利用,从而提高计算效率。

  • 与深度学习框架的兼容性:许多深度学习框架中都已经内置了对矩阵运算的支持,这使得将图表示为领接矩阵的形式更加方便与这些框架进行集成。

  • 通用性:领接矩阵可以表示各种类型的图,包括有向图、无向图、加权图、多重图等。

GNN与传统NN作比较

CNN 的本质是将一个像素和其周围的像素值通过(局部的)卷积核进行汇聚,经过组合多层(深度)卷积,生成一个(高层的)特征向量,该向量包含了图像的多个特征,是各项下游任务(分类,聚类,排名等)的基础。CNN大部分都在做特征提取的任务,这点在上周学习LSTM代码的时候看到过用一维CNN提取特征作为LSTM输入的例子。

而CNN的三个思想:局部、汇聚、组合,也是GNN的核心思想。

  • 局部性:GNN中的局部性是指节点的表示是通过聚合其邻居节点的表示来计算得到的。这种局部性的机制使得GNN能够捕捉到节点在其局部邻域内的信息,并利用这些信息来更新节点的表示。

  • 汇聚:GNN的汇聚体现在一个节点从周围节点收集信息。对信息进行汇聚,创造出一条新的信息,类似于CNN的卷积。左图是CNN的卷积,右图是GNN的汇聚

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TLxz2Xyp-1681741471136)(周报+ab14e843-4446-43b7-ad38-28f6bd08ba0c/图片.png)]

  • 组合:GNN的多轮信息传递,相当于CNN的多层卷积,在CNN中网络末端层的一个元素可由输入层的多个元素汇聚而成,在GNN中,一个节点的更新不仅与跟它直接相连的节点有关,因为在第二轮传递的时候,信息就到达了节点的领接节点,经过多轮后任意节点所收到的消息都可能融合了很多其他节点的消息,这跟CNN的第N层卷积层的上的值由前面很多层神经元相关很类似。

首先是节点的不同:

非欧数据比欧几里得数据的结构复杂,节点位置可以移动,但图还是之前那个图,所以想用传统CNN那种用一个卷积核在图上卷积是不可行的,并且节点的数量可能发生变化,比如新增或删除节点,这些操作会导致与深度学习模型的输入维度不匹配。

这个特征简单来说就是CNN具有平移不变性,旋转不变性。而图的节点没有顺序,同一个图可以有多个顺序,要求的是置换不变性。比如一个图,他的两种顺序就会出现两种领接矩阵,直接卷积的话就会出现不同的结果。

定义: 置换不变**,考虑我们要学习一个函数 f ,将图G(A,X)映射到空间里 ,使得f(A1,X1)=f(A2,X2) ,其中A ,X分别表示邻接矩阵和节点特征矩阵,1和2分别对应上面的两种顺序。如果对于任意的顺序 ,上面的式子都成立,就说f 是个置换不变**的函数。

其次是图中有边:

CNN跟RNN不是显式地表达节点之间的依存关系,而是通过不同的节点特征来间接表达节点之间的关系,这些相关只是作为节点的特征。而GNN用边来表示节点之间的依存关系。

如何与时序结合起来?

GNN在处理动态图其实就是涉及到时序的问题了。我查阅了资料了解了一下几种GNN处理时序问题的方法:

  • 一种是GNN+ 时序模型的方法:

    比如GNN-LSTM,即先将时间序列经过图神经网络进行空间上的卷积,然后再将结果输入到LSTM中进行时间上的卷积;或者LSTM-GNN,即先利用LSTM提取时序关系,然后再输入到GNN中进行空间上的卷积。当然,还可以分别利用LSTM和GNN直接对原始时间序列进行操作,然后再将二者结果进行组合。

  • 第二种是时间切片法:

    今天看到这里想起了师兄跟我提到的“每个时刻都是一个图,根据历史的多张图预测未来图的变化”应该就是这种方法,把动态图分解为多个时间步骤,每个时间步骤都是一个静态图。然后,将每个时间步骤作为输入,使用静态图的GNN进行处理。

  • 基于注意力机制的方法:

    这种方法通过引入一个注意力机制来处理时序信息。具体来说,每个节点都有一个自适应的时间权重,表示该节点在当前时间步骤中的重要性。然后,GNN会根据节点的时间权重来更新节点的表示。

  • ST-GCN

    这是一种基于时空图卷积网络的方法,用于处理时序动作识别问题。该方法将时序数据转换为时空图,并使用时空图卷积网络来进行处理。

Pytorch框架学习

创建张量

  • 先建个列表或元组c,c再转张量a

    a = torch.tensor(c)

    这个时候如果列表是float,张量会是float

    type(a) 可以看a的数据类型

  • 从另一个张量中初始化另一个张量

    zeros_like()ones_like()把某个张量变为全0,全1或rand_like()变为某个随机张量,新张量的shape跟原张量是一样的

  • 根据形状随机生成张量

    torch.rand((h, c))

张量常用函数

.shape 看形状 .device 看张量在哪个设备上

张量常用API

  • numel方法,torch.numel,返回张量的元素总数,当然也可以输出张量的shape,然后乘一下也可以表示。

创建类API

  • zeros方法,torch.zeros(),返回一个为全为0的张量,shape之类的由zeros(参数)里面的参数自己设置

  • arangerange,生成一维张量。张量的元素由参数设置,参数关键在于start和end以及step,也就是开始和结束数。 arange跟range的不同在于 size大1。arange不包括end,而range包含end。size的大小在下面的图中可以看到

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6tfE19R0-1681741471136)(周报+ab14e843-4446-43b7-ad38-28f6bd08ba0c/图片 1.png)]

  • eye创建一个对角线为1的张量,参数要设置矩阵的大小,最少设置一个h,此时为方阵。

  • full 创建一个值全为value,自定义size的张量。因此参数最主要就是value和size,调用方法用torch.full((h, c), value)

torch.full((2, 3), 3.141592)

输出为

tensor([[ 3.1416, 3.1416, 3.1416],
[ 3.1416, 3.1416, 3.1416]])


- `full_like(张量输入a, value)` ,根据输出的张量a,返回一个shape一样,但值为value的张量### 索引、切片API- `cat`连接。torch.cat(*tensors*, *dim=0*, ***, *out=None*), 第一个参数表示需要连接的tensor,dim表示在哪个维度进行连接,维度从0开始算,也就是行。```Python
import torch
import numpyb = torch.full((2, 2), 1)
print(b)
c= torch.full((2, 3), 2)
print(c)
d = torch.cat((b, c), dim=1)
print(d)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ONuCPD2a-1681741471138)(周报+ab14e843-4446-43b7-ad38-28f6bd08ba0c/图片 2.png)]

比如这里的b跟c,只能在列上加,所以dim为1。

  • stacktorch.stack(tensors, dim=0, ***, out=None)。stack跟cat虽然都是合并,但有很大的不同,stack会有维度上的叠加,而cat是在dim维度里面加上第二个张量的内容,最明显就是看中括号的个数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mfXFx2tH-1681741471138)(周报+ab14e843-4446-43b7-ad38-28f6bd08ba0c/图片 3.png)]

可以看中括号个数确定维度的变化,cat连接后还是二维,而stack堆叠后成了三维。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JuWBWJHI-1681741471138)(周报+ab14e843-4446-43b7-ad38-28f6bd08ba0c/图片 4.png)]

  • chunks切片。torch.chunk(input, chunks, dim=0),input是张量输入,chunks是分成几块,dim是在哪个维度进行分割。默认为0,也就是在行进行切割。

  • split分块。跟chunks的区别在于chunks是均分,而split可以不均分,按自己的想法分。torch.split(tensor, split_size_or_sections, dim=0)。三个参数中,dim不设置的时候默认为0,也就是行分块。最需要解释的是 split_size_or_sections,它表示每个张量块的大小,为整数,所以输入张量的大小/每个块大小不能整除的话,最后一个块可能会比较小。split_size_or_sections也可以为一个列表[1,2,3,4,…n],把输入分为n个张量,每个张量的块大小为对应位置的数字大小。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vq3QQVZr-1681741471138)(周报+ab14e843-4446-43b7-ad38-28f6bd08ba0c/图片 5.png)]

  • gather取变量。torch.gather(input, dim, index, ***, sparse_grad=False, out=None),前三个参数必须设置。gather沿着某个维度取变量。这个比较难。首先输出的形状跟Index一致,其次 ****主要是看dim和Index. dim=0,则要去找的行为index上的值,列不用看index的值。dim=1,则列为index上对应的值,列不看。比如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WDggemU0-1681741471138)(周报+ab14e843-4446-43b7-ad38-28f6bd08ba0c/图片 6.png)]

这个时候的列看什么? 不看索引表的值,直接看当前确定的元素是第几列就为第几列。

  • reshape重塑形状,元素数和相对顺序不变。torch.reshape(input, shape)。参数就两个,输入,形状,这里的形状(h, c)要保证h*c=元素总数。想变成一维的,也就是拉直(在不知道总长度的时候),a[-1]在Python中表示最后一个元素,那么shape可以用[-1]或者(-1,)来表示一维拉长。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uxo4g9zQ-1681741471138)(周报+ab14e843-4446-43b7-ad38-28f6bd08ba0c/图片 7.png)]

  • scatter_ .有下划_的一般是直接在该位操作。选定某些位置并改变他们的值。.scatter_(dim, index, src, reduce=None)。在张量上选位置的时候跟gather的索引一样,需要注意的是取src覆盖的时候,是在src上直接取index相同位置的值。如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xyS2z3u0-1681741471138)(周报+ab14e843-4446-43b7-ad38-28f6bd08ba0c/图片 8.png)]

至于填的位置,就跟gather一样了,看dim和index.

  • scatter_add_ ,跟普通的不同在于他这里是+src的值。

  • squeezetorch.squeeze(input, dim=None)。这个API的作用是消除多余的维度,dim可以指定消除某个维度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kF8B6oeY-1681741471139)(周报+ab14e843-4446-43b7-ad38-28f6bd08ba0c/图片 9.png)]

  • taketorch.take(input, index)。根据索引的下标在一维的input中找到。意思先把input拉成一维,再根据index查找。

总结

这周的成果主要就是跟着师兄给的课程学了一些Pytorch框架的基本操作,然后看了不少关于GNN和时序相结合的帖子,下周除了继续学习pytorch课程外,我打算找篇GNN和时序结合的论文来看,然后等pytorch框架掌握差不多了,就去跟师兄要数据集跑试试。

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

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

相关文章

Qt自定义类型

概述 在使用Qt创建用户界面时,特别是那些具有特殊控件和特性的界面时,开发人员有时需要创建新的数据类型,以便与Qt现有的值类型集一起使用或代替它们。 QSize、QColor和QString等标准类型都可以存储在QVariant对象中,作为基于qo…

51单片机第6步_stdlib.h库函数

本章重点学习stdlib.h库函数。 #include <REG51.h> //包含头文件REG51.h,使能51内部寄存器; #include <stdlib.h> //float atof (char *s1); //参数s1字符串可包含正负号,小数点或E(e)来表示指数部分,如123.456或123e-2; //若首字符是非数据字符,或为正负号…

es6语法复习一

es6语法 1.var 变量提升 2.let 不存在变量提升&#xff0c;只能定义一次 3.const 先定义再使用&#xff0c;定义好来不能修改 4.解构赋值 [a,b,c][1,2,3],{a,b,c}{a:1,b:2,c:3} 5.模版字符串 let aaa; ${a} is ok 6.对象简化写法 const school{ name, change, improve(){ cons…

力扣2438.二的幂数组中查询范围内的乘积

力扣2438.二的幂数组中查询范围内的乘积 lowbit求所有2的幂 accumulate函数(begin,end,start,way)求和/积的方式求积并取模 const int N 1e9 7;class Solution {public:int lowbit(int x){return x & -x;}vector<int> productQueries(int n, vector<vector&l…

[NSSCTF]-Reverse:[SWPUCTF 2021 新生赛]easyapp(安卓逆向,异或)

无壳 把后缀名改为zip&#xff0c;找到apk 查看jadx 这里调用了MainActivity的lambda$onCreate$0$MainActivity&#xff0c;然后又调用了Encoder进行异或。 exp&#xff1a; result棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌 key987654321 flag for i in range(len(result)):flagchr(…

HarmonyOS开发:应用完整性校验

简介 为了确保应用的完整性和来源可靠&#xff0c;OpenHarmony需要对应用进行签名和验签。 应用开发阶段&#xff1a; 开发者完成开发并生成安装包后&#xff0c;需要开发者对安装包进行签名&#xff0c;以证明安装包发布到设备的过程中没有被篡改。OpenHarmony的应用完整性校…

Foxit Reader与PDF交互性:探索高级功能

引言 PDF&#xff08;Portable Document Format&#xff09;文件格式以其跨平台的一致性和丰富的多媒体支持而广受欢迎。Foxit Reader作为一款功能全面的PDF阅读器&#xff0c;不仅提供了基本的查看和导航功能&#xff0c;还支持PDF文件中的多种交互式元素。本文将深入探讨Fox…

SQL Server中 MERGE 语句

在 SQL Server 中,MERGE 语句用于根据两个表之间的条件来插入、更新或删除记录。它通常用于同步两个表的数据,其中一个表是源表(包含要插入或更新的数据),另一个是目标表(数据要插入或更新的表)。 1、本文内容 语法参数备注触发器的实现权限有关索引的最佳做法MERGE 的…

探索sklearn的贝叶斯奥秘:朴素贝叶斯分类器全解析

&#x1f680; 探索sklearn的贝叶斯奥秘&#xff1a;朴素贝叶斯分类器全解析 朴素贝叶斯分类器是一类基于贝叶斯定理的简单概率分类器&#xff0c;它们在文本分类、垃圾邮件识别等领域表现出色。在Python的sklearn库中&#xff0c;朴素贝叶斯分类器以其实现简单和效率高效而受…

关于响应式编程的理解与SpringCloudGateway的理解

关于响应式编程的理解与SpringCloudGateway的理解 一. 响应式编程与函数式编程的区别二. 响应式编程中常用的组件2.1 RxJava定义2.2 Rxjava基本概念2.3 RxJava 用法 三 SpringcloudGateway四 常见的四种限流规则 一. 响应式编程与函数式编程的区别 总的来说&#xff0c;响应式编…

qt中的枚举值-QMetaEnum

QMetaEnum 测试代码hcpp 讲解 测试代码 h #include <QMainWindow> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~M…

GPIO和PIN

文章目录 1 GPIO和Pin1.1 GPIO和Pin基础概念1.2 GPIO输入模式1.3 GPIO输出模式1.4 GPIO的HAL库1.4.1 一些HAL库表示1.4.2 HAL库常用GPIO函数1.4.3 GPIO点亮led灯程序例子 1 GPIO和Pin 1.1 GPIO和Pin基础概念 ​ 单片机有很多的引脚&#xff0c;为了操控每一个引脚&#xff0c…

grpc学习golang版( 四、多服务示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写Client客…

MySQL之可扩展性(九)

可扩展性 直接连接 2.修改应用的配置 还有一个分发负载的办法是重新配置应用。例如&#xff0c;你可以配置多个机器来分担生成大报表操作的负载。每台机器可以配置成连接到不同的MySQL备库&#xff0c;并为第N个用户或网站生成报表。 这样的系统很容易实现&#xff0c;但如果…

使用Python自动化收集和处理视频资源的教程

在这篇教程中&#xff0c;我们将介绍如何利用Python脚本自动化收集和处理视频资源。这篇文章将帮助您掌握基本的网络自动化技术&#xff0c;并使用相关库进行视频资源的获取和保存。以下是具体的实现步骤和代码示例。 环境准备 在开始之前&#xff0c;请确保您的工作环境中已…

数据库基础教程

数据库基础教程 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在本文中&#xff0c;我们将深入探讨数据库的基础知识和操作&#xff0c;帮助您建立起扎实的数据…

Spring Boot集成jasypt快速入门Demo

1.什么是Jasypt&#xff1f; Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个专注于简化Java加密操作的工具。 它提供了一种简单而强大的方式来处理数据的加密和解密&#xff0c;使开发者能够轻松地保护应用程序中的敏感信息&#xff0c;如数据库密码、API密…

stl的map和set

概念 map和set底层都是红黑树 set是key模型结构&#xff0c;本质就是看一个元素在不在容器中。 map是key/value结构&#xff0c;里面存了一个pair结构&#xff0c;可以通过一个值来查找另外一个值 map和set结构中遍历出来的都是有序并且去重了的&#xff0c;map和set都支持增…

Java高级重点知识点-17-异常

文章目录 异常异常处理自定义异常 异常 指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。Java处 理异常的方式是中断处理。 异常体系 异常的根类是 java.lang.Throwable&#xff0c;&#xff0c;其下有两个子类&#xff1a;ja…

【QT】概述|对象树模型|两种控件模式|信号和槽|lambda

目录 什么是QT 特点 QT程序 main函数 QT按钮 纯代码模式 图形化模式 对象树模型 信号和槽 连接与断开 自动连接 断开连接 信号的发射 lambda表达式 基本语法 捕获列表 Lambda表达式用于信号与槽的连接 例如 什么是QT Qt是一个跨平台的C图形用户界面应用…