在Pytorch上使用稀疏矩陣
最近在寫一個NLP的小項目,用到了Pytorch作神經網絡模型。可是衆所周知NLP的一個特色就是特徵矩陣是稀疏矩陣,當時處理稀疏矩陣用的是scipy.sparse,如今要把它放到Pytorch中,仍是費了一點周折的python
首先,如何把python的二維數組(這裏以trainData爲例)轉換爲稀疏矩陣呢?這一步很簡單,只須要數組
from scipy.sparse import coo_matrix
,而後使用coo_matrix(trainData)
就行了服務器
其實 scipy.sparse下面有三種稀疏矩陣,這篇文章有一個大概的介紹:網絡
scipy.sparse.coo_matrix是三元組,不能按行也不能按列切片函數
to_csr 是按行壓縮的稀疏矩陣,按行切片比較快,能夠按列切片spa
to_csc 是按列壓縮的稀疏矩陣,按列切片比較快,能夠按行切片.net
這篇文章介紹了稀疏矩陣的COO和CSR存儲方式:http://www.javashuo.com/article/p-tgqruofq-mx.htmlcode
這裏咱們使用coo_matrix就好,是由於咱們等會要從新建立torch上的稀疏矩陣,這裏只要參數就行了。blog
如何將scipy上的稀疏矩陣轉換爲torch上的:教程
values =X_train.data indices = np.vstack((X_train.row, X_train.col)) i = torch.LongTensor(indices) v = torch.FloatTensor(values) shape = X_train.shape X_train=torch.sparse.FloatTensor(i, v, torch.Size(shape))
上面這部分能夠寫成個函數
要恢復爲完整的二維tensor,直接調用X_train的to_dense()方法就行了,返回值就是普通的tensor
可是,遇到了新的問題,Torch上的稀疏矩陣怎麼做爲神經網絡模型的輸入呢?我在網上查了半天也沒看到,只有一個keras的教程:https://www.jianshu.com/p/a7dadd842f78。我的以爲在torch上應該也是有辦法的,遇到了這個問題的同窗能夠在Github上查找一些torch作NLP的項目,由於我不是作這個方向的,因此沒有深究。
什麼,你問我是怎麼解決的?我把項目放到內存比我的電腦大得多的服務器上運行了2333