第六周周報

摘要

本周重點跟著網課學習了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.pswp.cn/diannao/38116.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38116.shtml
英文地址,請注明出處:http://en.pswp.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圖形用戶界面應用…