問題:String類型在pytorch中如何表示?
很遺憾,pytorch不是完備的語言庫,而是面向數據計算的一個GPU加速庫,因此沒有內建對string的支持
我們會在做NLP的時候會遇到all string處理的問題,就比如說一句話,把這句話翻譯成另外一個國家的語言,這里面肯定是要注意string的,那么作為深度學習的一個GPU加速庫pytorch免不了要處理string,但是它內部又沒有string的自帶的表示方法,那如何表達string呢?
兩種表示方法:
- One-hot
- [0,1,0,0,…]
- Embedding
- Word2vec
- glove
one-hot之前已經講過,這里簡單回顧,比如要表達貓狗這兩類,用一維向量[0,1]來表示cat,[1,0]來表示dog,因此是一種編碼表示,我們其實是沒有內建string的支持的,只是用一種數字的方法來替代了
26個字母只要編碼為一個長度為26的向量,但對于漢字或者多國的語言,甚至其他的單詞(英語單詞常用的單詞有上萬個),那么單詞如果用一個上萬列向量的編碼來表示,整個向量會變得會變得非常稀疏(也就是大部分元素是0,只有一個元素位置是1),更致命的是這個向量會因為語言之間(例如 i like 或 i love)的語義相關性(i dislike)語義相反性,但對于one-hot編碼來說每一個位置代表一個意思,因此兩個單詞之間的相關性并沒有在one-hot中得到體現,怎么解決這個問題?
在NLP里面有一個專門的embedding layer,就是解決怎么用數字的方法來表示一個語言并具有相關性的方法
注意:一個tensor有可能被放置在CPU上,也有可能被放置在GPU上,對于GPU上的tensor,即使我們覺得可能它和CPU上的tensor是一個東西,但是對于pytorch來說并不是,GPU上的tensor會在中間加cuda
x.cuda()會返回gpu上的一個引用
數據一樣,放的位置不一樣,造成的類型不一樣
標量
1.3是0維,但是[1.3]是1維,長度為1的Tensor
問題:dimension為0的數據用來表示什么?
最常見的就是計算loss,計算輸出值跟我們期待的那個值之間的誤差,誤差最終求和平均后會得到一個標量,這個標量就稱之為loss,這個loss用的最多的就是一個dimension為0的標量,如果用instance把它打印出來的話可以看到是一個size為0的某一種數據類型
問題:如何得到變量的shape
a.shape對應的是a.size()函數,shape是一個成員,而size()是一個成員函數
dimension為1
數學中叫做向量,pytorch中統一稱之為張量
.tensor()的時候指定的是具體的數據
.FloatTensor()的時候是隨機初始化的,只需要接收數據的shape
問題:dimension為1的tensor一般用在哪?
用在bias(偏移量),偏移量的維度一般都是1維的
神經網絡線性層的輸入
[28,28]=>[784]
pytorch 0.3之前dimension=0是不存在的
為了區分標量0.3和長度為1的向量[0.3]就引入了dimension=0
如何得到dimension為1向量的shape
可以用.shape也可以用.size()函數
問題:如何區分dimension、size(或者叫shape)?
比如說2維的tensor,這個2維的2的意思就是dimension,size是整個shape
dimension就是size的長度
size就是指代的tensor具體的形狀
dimension為2
dimension=2經常使用的例子
帶有batch的線性層的輸入,例如1張圖片用784的dimension為1的tensor來表達,但是如果一次要輸入多張圖片怎么辦?
把多張圖片疊在一起,每一張圖片用784位的向量來表示,因此這個tensor的維度就是2,這個tensor的size就是[4,784]
第一個維度的4表示哪一張照片,每一張照片跟著的784這樣的一個維度表示這個照片的具體數據內容
dimension為3
對于三維的tensor用一個非常廣泛的使用場景RNN,對于一個RNN來說,一句話有10個單詞,每個單詞用one-hot編碼,比如說用100位這樣的向量來編碼
10個單詞word是W,每一句話的feature是F用100位的向量來表示,如[10,100]
如果要一次送入多句話的話我們要將batch插在中間[10,20,100],10個單詞每一次送20句話每一個單詞用一個100維的向量來表示,所以20表示20句句子
dimension為4
對于4維的tensor適合圖片這種類型CNN
[2,3,28,28]
1是通道數,對于灰色圖片來說通道數是1,彩色圖片的通道數是3
有2張照片,每一張照片有3個通道,每個通道的長寬為28×28
額外知識
除了可以用shape獲取tensor的形狀,還可以用獲取tensor元素的總數4704=2328*28
除了len(a.shape)可以返回shape的長度以外(即tensor的維度),a.dim()也可以返回tensor的維度,并且更加直觀