NLP小專案 emojify(二)

2021-08-15 17:31:11 字數 2504 閱讀 6279

我們已經有了乙個訓練好的詞向量,那麼在keras中很好處理,可以看我的

那麼pytorch是怎麼實現與訓練向量的匯入的呢,如果看官方文件,檢視完整引數列表,發現似乎沒有引數可以實現

預訓練向量的匯入,只有定義好就是隨機的初始化向量。檢視了原始碼,發現了儲存embeding權重的變數就是weights,然後我

嘗試直接修改weights的值,踩了幾個坑,最後採用如下實現:

self.word_embeds = nn.embedding(vocab_size, embedding_dim)

weight = np.array(weight)

self.word_embeds.weight.data.copy_(torch.from_numpy(weight))

ok,測試一下,怎麼測試呢,隨便找個詞輸入可以檢視50維度的詞向量,輸入到上面的embeding層中,再輸入到乙個

沒有賦值的embeding層中,通過檢視詞向量是否一致來看是不行的,因為embeding層每次都會隨機選取初始化向量的,

不一致才是正常的,因此我們可以通過執行兩次上面賦值後embeding,看看是否一樣,一樣說明賦值成功了,否則的話

隨機變化肯定是不會一樣的。測試**如下:

vocab_len = len(word_to_index) + 1  #word index begin with 1,plus 1 for padding 0

emb_dim = word_to_vec_map["cucumber"].shape[0]

emb_matrix = np.zeros((vocab_len, emb_dim))

for word, index in word_to_index.items():

emb_matrix[index, :] = word_to_vec_map[word]

word_embeds = nn.embedding(vocab_len, 50)

pretrained_weight = np.array(emb_matrix)

word_embeds.weight.data.copy_(torch.from_numpy(pretrained_weight))

input = variable(torch.longtensor([word_to_index["cucumber"]]))

print("111:",word_embeds(input))

print("222:",word_embeds(input))

print("333:",word_embeds(input))

為了保險,我輸入了三次,結果都是一樣的,這就說明賦值是成功的。

我們知道,訓練時,我們是不希望詞向量的值改變的,因為這個向量已經在很大的語料庫上訓練好了,不需要改變,

因此就涉及到固定子層引數不更新的技巧。這個方法有很多,常用的是requires_grad和volatile,requires_grad = false等同於

volatile = true。我就只說說前者了,每個variable都有這個引數,自然就包括model的parameter,因此我們可以設定

embeding層的引數的parameter的requires_grad為false,這樣就不會計算他們的梯度了,這樣還會提公升模型訓練的速度,

因為預訓練的詞向量矩陣還是維度很大的,如果每次反向傳播都計算它的梯度會極大地影響訓練的速度。當然這樣還是不夠的,

設定優化器的時候,第乙個引數就不可以是model。parameter(),因為embeding層的梯度是沒有的,也就優化不了,因此要將它排除。

由於這裡的層很少,因此我採用如下方法:

optimizer1 = torch.optim.adam(model.rnn.parameters(),lr=0.001)

optimizer2 = torch.optim.adam(model.linear.parameters(),lr=0.001)

就是用兩個優化器,分別優化剩下的兩個層。這個方法是我自己想的,不知道有沒有什麼bug。那麼自然,後面更新的step,

也要兩個優化器一起step。完整**我會上傳到我的github的。

剩下的就蠻簡單的了,注意好好看官方文件對應的api,每個引數都了解,能節省**就節省**,比如2層lstm中間接dropout,keras是依次實現的,而pytorch可以直接乙個函式實現。具體結構如下:

記得還有乙個問題是,讀取自定義資料集時,會把資料變成doubletensor,target變成了inttensor,轉化成longtensor就是

直接在後面加上.long(),就行了,其他的tensor之間的轉化也如此,.int(),.float(),等等。

完整**位址

pytorch實現emojify,喜歡的點個star,感謝。我的主要目的其實就是讓大家發現官方源**的好處,一定要好好讀,我考慮之後會出乙個系列,專門解讀框架的源**,乙個類乙個類的詳細解說,首先就是pytorch和torchvision,其他框架也會考慮的。

爬蟲小專案

將爬取到的資料儲存在csv檔案中 由於習慣 作者會將獲取到的資料儲存 然後在儲存的檔案中進行匹配 這樣會降低程式執行時間 import requests from lxml import html from bs4 import beautifulsoup url headers res reque...

前端 小專案

全部42區 段子愛了 你問我答 註冊登入 最熱最新 人類發布 即時順序 24小時 3天發布 人們都說 桂林山水甲天下。我們乘著木船蕩漾在漓江上,來觀賞桂林的山水。人們都說 桂林山水甲天下。我們乘著木船蕩漾在漓江上,來觀賞桂林的山水。人們都說 桂林山水甲天下。我們乘著木船蕩漾在漓江上,來觀賞桂林的山水...

大專案小專案

很多人責怪第一門計算機語言的老師不行 我也是的 雖然那個時候自己無心也無力對老師進行評價 現在想想只能用 誤人子弟 來形容這位尊敬的副院長 很神奇授課的時候把大學的東西搞明白了 小碩的時候把授課的東西搞明白了 工作了把小碩的東西搞明白了 永遠都慢了一拍 那什麼時候才能把工作的東西搞明白?今年的工作接...