Pytorch关于高维tensor的dim上操作的理解--以cosine_similarity的dim参数为例
問題的引出
關于pytorch中dim的描述個人總是弄的不是很清楚,好多地方存在著疑問,這次在實驗過程中需要比較兩個高維tensor的相似度,由于需要確定在哪一維進行比較,故去測試了pytorch中關于tensor維度的一些現象。
dim
關于dim許多博客都有比我更加專業的解釋,dim具體的解釋也不是本文的重點,這里盜用其他博客里的一張圖,這張圖也是我認為對dim比較好的直觀的解釋(原文鏈接),本文的重點在于對高維tensor維度上操作,即不同的操作在不同的維度上進行會有怎樣的不同
Cosine_similarity
如果你想對兩個tensor比較他們之間的相似度,那么torch.cosine_similarity函數是一個不錯的選擇,但是在該函數的參數列表中,有一個dim值,在官方文檔中,值介紹了這個參數用來指定在哪一維上進行操作,但我在實際使用過程中卻對這個概念理解的不好,后來經過不斷的實驗終于弄懂了dim的含義。
先從二維開始
大部分博客只說明了有關二維的情況,而二維的情況是比較好想的,重點是在高維如三維情況下的tensor,那么這里我們還是從二維開始,先去看一下基本的在維度上的操作
首先直觀上我們可以發現,當dim選擇在哪一維上操作時,相應的那一維就消失了(這里說的消失,指直觀現象,但個人覺得不是特別好理解),
對第一維操作
上述代碼作用在第一維上,那么他的結果是怎么樣的呢?
他的結果有兩個元素(個人認為這里討論維度容易混亂,不如直接說元素的個數),對應原來的p1的shape我們發現在第一維上操作使得第一維消失了,即[2,3]->[2],這也是大多數博客的解釋,但我認為這并沒有揭示真正的工作過程,同時如果應用到高維的情況,很容易得到一個令人疑惑的維度。
下面讓我們來試著理解一下dim的含義,上述的例子中的圖片說的已經比較明顯了,在dim=1上操作,實際的含義為在以第一維為單位進行操作,即對每一行進行操作(說法不嚴謹,但為了方便理解),或者也可以這樣進行理解就是固定第一維(即tensor的列),去比較第0維(tensor的行)。
對第0維操作
那么按照該思想,如果按照第0維操作,即對每一列為單位進行操作,那么得到的應該是一個有三個元素(為了方便理解,有不嚴謹的表述)的結果,分別為對應列之間的相似度:
通過實驗驗證,我發現確實如此。
三維的情況
在實際應用中,tensor的形狀一般是[batch,seq_len,embed]這樣三維的形狀,那么在三維中對不同的維度操作會有怎樣的差別
對第0維操作
p1 = torch.rand([2,2,3]) p2 = torch.rand([2,2,3]) print(p1) print(p2) p3 = torch.cosine_similarity(p1,p2,dim=0) print(p3) print(p3.shape)當取dim=0時,注意此時第0維實際上是batch的維度,則固定batch不動,比較后面的[2,3]的元素,那么后面的是怎么比較的呢?依舊是按照第0維,這里的第0維實際上是后面那個[seq_len,embed]的第0維,即對列進行操作,所以其結果為13三個元素,而原來的tensor有兩個batch,所以分別比較后就有23個元素,第一行元素是第一個batch中的[2,3]個元素按照第0位求相似的的結果,同理第二行也是
對第一維或第二維操作
這里的過程實際上就和二維的情況一樣的,不過需要注意的是二維情況中的第0維對應三維情況的第1維,二維情況的第1維實際上對應三維中的第2維。
不同的是,三維中是一個batch內進行比較,所以,只要在二維操作的基礎上加上batch的一維就可以了
總結
以上是生活随笔為你收集整理的Pytorch关于高维tensor的dim上操作的理解--以cosine_similarity的dim参数为例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UIStoryBoard 中修改控件bo
- 下一篇: unity 引用 移动mm 支付sdk