成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

簡(jiǎn)單有趣的NLP教程:手把手教你用 PyTorch 辨別自然語(yǔ)言(附代碼)

大數(shù)據(jù)
本文手把手教你用 PyTorch 辨別自然語(yǔ)言(附代碼)。

手把手教你用 PyTorch 辨別自然語(yǔ)言(附代碼)

最近在學(xué)pyTorch的實(shí)際應(yīng)用例子。這次說(shuō)個(gè)簡(jiǎn)單的例子:給定一句話,判斷是什么語(yǔ)言。這個(gè)例子是比如給定一句話:

  1. Give it to me 
  2.  
  3. 判斷是 ENGLISH 
  4.  
  5. me gusta comer en la cafeteria 
  6.  
  7. 判斷是 SPANISH  

就是這么簡(jiǎn)單的例子。

來(lái)看怎么實(shí)現(xiàn):

準(zhǔn)備數(shù)據(jù) 格式 [(語(yǔ)句,類型),…]

data是train的時(shí)候用的語(yǔ)句,test_data是test的時(shí)候用的語(yǔ)句

  1. data = [ ("me gusta comer en la cafeteria".split(), "SPANISH"), 
  2.  
  3.          ("Give it to me".split(), "ENGLISH"), 
  4.  
  5.          ("No creo que sea una buena idea".split(), "SPANISH"), 
  6.  
  7.          ("No it is not a good idea to get lost at sea".split(), "ENGLISH") ] 
  8.  
  9. test_data = [("Yo creo que si".split(), "SPANISH"), 
  10.  
  11.               ("it is lost on me".split(), "ENGLISH")]  

因?yàn)槲谋居?jì)算機(jī)室識(shí)別不出來(lái)的,他們只認(rèn)識(shí)01串,也就是數(shù)字。所以我們得把文本映射到數(shù)字上。

  1. word_to_ix = {} 
  2.  
  3. for sent, _ in data + test_data: 
  4.  
  5.     for word in sent: 
  6.  
  7.         if word not in word_to_ix: 
  8.  
  9.             word_to_ix[word] = len(word_to_ix) 
  10.  
  11. print(word_to_ix)  

輸出word_to_ix (意思是word to index)是:

  1. {'me': 0, 'gusta': 1, 'comer': 2, 'en': 3, 'la': 4, 'cafeteria': 5, 'Give': 6, 'it': 7, 'to': 8, 'No': 9, 
  2.  'creo': 10, 'que': 11, 'sea': 12, 'una': 13, 'buena': 14, 'idea': 15, 'is': 16, 'not': 17, 'a': 18, 'good': 19, 
  3.  'get': 20, 'lost': 21, 'at': 22, 'Yo': 23, 'si': 24, 'on': 25}  

這里先提前設(shè)置下接下來(lái)要用到的參數(shù)

  1. VOCAB_SIZE = len(word_to_ix) 
  2.  
  3. NUM_LABELS = 2#只有兩類 ENGLISH SPANISH  

固定模板

def init(self, num_labels, vocab_size):初始化,就是輸入和輸出的大小。這里我們要輸入是一個(gè)句子,句子***就是擁有所有字典的詞,這里也就是vocab_size(下面再說(shuō)怎么將一句話根據(jù)字典轉(zhuǎn)換成一個(gè)數(shù)字序列的),輸出就是分類,這里分為2類,即num_labels。這里我們用的是線性分類 ,即nn.Linear()。

def forward(self, bow_vec):bow_vec是一個(gè)句子的數(shù)字化序列,經(jīng)過(guò)self.linear()得到一個(gè)線性結(jié)果(也就是預(yù)測(cè)結(jié)果),之后對(duì)這個(gè)結(jié)果進(jìn)行softmax(這里用log_softmax是因?yàn)橄旅娴膿p失函數(shù)用的是NLLLoss() 即負(fù)對(duì)數(shù)似然損失,需要log以下)

  1. class BoWClassifier(nn.Module):#nn.Module 這是繼承torch的神經(jīng)網(wǎng)絡(luò)模板 
  2.  
  3.     def __init__(self, num_labels, vocab_size):  
  4.  
  5.         super(BoWClassifier, self).__init__() 
  6.  
  7.         self.linear = nn.Linear(vocab_size, num_labels) 
  8.  
  9.     def forward(self, bow_vec): 
  10.  
  11.         return F.log_softmax(self.linear(bow_vec)) 
  12.  
  13. def make_bow_vector(sentence, word_to_ix)  

大概能看懂什么意思吧。就是把一個(gè)句子sentence通過(guò)word_to_ix轉(zhuǎn)換成數(shù)字化序列.比如 sentence=我 是 一只 小 小 鳥(niǎo) word_to_id={你:0,我:1,他:2,不:3,是:4,大:5,小:6,豬:7,鳥(niǎo):8,,} make_bow_vector之后的結(jié)果是[0,1,0,0,1,0,2,0,1]。view()就是改變下向量維數(shù)。

這里是講len(word_to_ix)1->1len(word_to_ix)

  1. def make_bow_vector(sentence, word_to_ix): 
  2.  
  3.     vec = torch.zeros(len(word_to_ix)) 
  4.  
  5.     for word in sentence: 
  6.  
  7.         vec[word_to_ix[word]] += 1 
  8.  
  9.     return vec.view(1, -1)  

這個(gè)就不用說(shuō)了吧 一樣。(如果想知道torch.LongTensor啥意思的話。可以看看。Torch中,Tensor主要有ByteTensor(無(wú)符號(hào)char),CharTensor(有符號(hào)),ShortTensor(shorts), IntTensor(ints), LongTensor(longs), FloatTensor(floats), DoubleTensor(doubles),默認(rèn)存放為double類型,如果需要特別指出,通過(guò)torch.setdefaulttensortype()方法進(jìn)行設(shè)定。例如torch.setdefaulttensortype(‘torch.FloatTensor’)。 )

  1. def make_target(label, label_to_ix): 
  2.  
  3.     return torch.LongTensor([label_to_ix[label]])  

這里再介紹下model.parameters()這個(gè)函數(shù)。他的返回結(jié)果是model里的所有參數(shù)。這里我們用的是線性函數(shù),所以就是f(x)=Ax+b中的A和b(x即輸入的數(shù)據(jù)),這些參數(shù)在之后的反饋和更新參數(shù)需要的。

  1. model = BoWClassifier(NUM_LABELS, VOCAB_SIZE) 
  2.  
  3. for param in model.parameters(): 
  4.  
  5.     print("param:", param)  

可以看出A是2len(vocab_size),b是21

  1. param: Parameter containing: 
  2.  
  3. Columns 0 to 9  
  4.  
  5.  0.0786  0.1596  0.1259  0.0054  0.0558 -0.0911 -0.1804 -0.1526 -0.0287 -0.1086 
  6.  
  7. -0.0651 -0.1096 -0.1807 -0.1907 -0.0727 -0.0179  0.1530 -0.0910  0.1943 -0.1148 
  8.  
  9. Columns 10 to 19  
  10.  
  11.  0.0452 -0.0786  0.1776  0.0425  0.1194 -0.1330 -0.1877 -0.0412 -0.0269 -0.1572 
  12.  
  13. -0.0361  0.1909  0.1558  0.1309  0.1461 -0.0822  0.1078 -0.1354 -0.1877  0.0184 
  14.  
  15. Columns 20 to 25  
  16.  
  17.  0.1818 -0.1401  0.1118  0.1002  0.1438  0.0790 
  18.  
  19.  0.1812 -0.1414 -0.1876  0.1569  0.0804 -0.1897 
  20.  
  21. [torch.FloatTensor of size 2x26] 
  22.  
  23. param: Parameter containing: 
  24.  
  25.  0.1859 
  26.  
  27.  0.1245 
  28.  
  29. [torch.FloatTensor of size 2]  

我們?cè)倏纯磎odel的def forward(self, bow_vec):怎么用。這里就想下面的代碼一樣,直接在mode()填一個(gè)參數(shù)即可,就調(diào)用forward函數(shù)。

  1. sample = data[0] 
  2.  
  3. bow_vector = make_bow_vector(sample[0], word_to_ix) 
  4.  
  5. log_probs = model(autograd.Variable(bow_vector)) 
  6.  
  7. print("log_probs", log_probs) 

輸出是:(就是log_softmax后的值)

  1. log_probs Variable containing: 
  2.  
  3. -0.6160 -0.7768 
  4.  
  5. [torch.FloatTensor of size 1x2]  

我們這里看看在test上的預(yù)測(cè)

  1. label_to_ix = { "SPANISH": 0, "ENGLISH": 1 } 
  2.  
  3. for instance, label in test_data: 
  4.  
  5.     bow_vec = autograd.Variable(make_bow_vector(instance, word_to_ix)) 
  6.  
  7.     log_probs = model(bow_vec) 
  8.  
  9.     print log_probs 
  10.  
  11. print next(model.parameters())[:,word_to_ix["creo"]]  

結(jié)果是

  1. Variable containing: 
  2.  
  3. -0.5431 -0.8698 
  4.  
  5. [torch.FloatTensor of size 1x2] 
  6.  
  7. Variable containing: 
  8.  
  9. -0.7405 -0.6480 
  10.  
  11. [torch.FloatTensor of size 1x2] 
  12.  
  13. Variable containing: 
  14.  
  15. -0.0467 
  16.  
  17.  0.1065 
  18.  
  19. [torch.FloatTensor of size 2]  

下面就該進(jìn)行重要的部分了。

循環(huán)訓(xùn)練和更新參數(shù)

這里我們用的損失函數(shù)是nn.NLLLoss()負(fù)對(duì)數(shù)似然損失,優(yōu)化依然用的最常見(jiàn)的optim.SGD() 梯度下降法,一般訓(xùn)練5-30次最終優(yōu)化基本不再變化。

每一步過(guò)程:

a. 首先都要model.zero_grad(),因?yàn)榻酉聛?lái)要極端梯度,得清零,以防問(wèn)題

b. 將數(shù)據(jù)向量化(也可以說(shuō)是數(shù)字序列化,轉(zhuǎn)成計(jì)算機(jī)能看懂的形式)

c. 得到預(yù)測(cè)值

d. 求損失loss_function

e. 求梯度loss.backward()

f. 更新參數(shù)optimizer.step()

  1. loss_function = nn.NLLLoss() 
  2.  
  3. optimizer = optim.SGD(model.parameters(), lr=0.1) 
  4.  
  5. for epoch in range(100): 
  6.  
  7.     for instance, label in data: 
  8.  
  9.         model.zero_grad() 
  10.  
  11.         bow_vec = autograd.Variable(make_bow_vector(instance, word_to_ix)) 
  12.  
  13.         target = autograd.Variable(make_target(label, label_to_ix)) 
  14.  
  15.         log_probs = model(bow_vec) 
  16.  
  17.         loss = loss_function(log_probs, target) 
  18.  
  19.         loss.backward() 
  20.  
  21.         optimizer.step()  

在測(cè)試集上測(cè)試

  1. for instance, label in test_data: 
  2.  
  3.     bow_vec = autograd.Variable(make_bow_vector(instance, word_to_ix)) 
  4.  
  5.     log_probs = model(bow_vec) 
  6.  
  7.     print log_probs  

我們?cè)诮Y(jié)果上很容易看到***個(gè)例子預(yù)測(cè)是SPANISH***,第二個(gè)是ENGLISH***。成功了。

  1. Variable containing:  
  2. -0.0842 -2.5161 
  3.  
  4. [torch.FloatTensor of size 1x2] 
  5.  
  6. Variable containing: 
  7.  
  8. -2.4886 -0.0867 
  9.  
  10. [torch.FloatTensor of size 1x2]  
責(zé)任編輯:龐桂玉 來(lái)源: 36大數(shù)據(jù)
相關(guān)推薦

2018-12-10 10:00:06

Python神經(jīng)網(wǎng)絡(luò)編程語(yǔ)言

2021-08-09 13:31:25

PythonExcel代碼

2022-10-19 14:30:59

2018-12-29 09:38:16

Python人臉檢測(cè)

2017-10-29 21:43:25

人臉識(shí)別

2011-03-28 16:14:38

jQuery

2021-02-04 09:00:57

SQLDjango原生

2021-02-06 14:55:05

大數(shù)據(jù)pandas數(shù)據(jù)分析

2022-08-04 10:39:23

Jenkins集成CD

2018-06-23 07:38:10

2009-04-22 09:17:19

LINQSQL基礎(chǔ)

2021-05-10 06:48:11

Python騰訊招聘

2021-01-21 09:10:29

ECharts柱狀圖大數(shù)據(jù)

2021-01-08 10:32:24

Charts折線圖數(shù)據(jù)可視化

2020-03-08 22:06:16

Python數(shù)據(jù)IP

2012-01-11 13:40:35

移動(dòng)應(yīng)用云服務(wù)

2021-08-02 23:15:20

Pandas數(shù)據(jù)采集

2021-02-02 13:31:35

Pycharm系統(tǒng)技巧Python

2021-12-11 20:20:19

Python算法線性

2018-03-23 20:45:23

機(jī)器學(xué)習(xí)NLP文本數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品在线免费观看视频 | 欧美一级在线 | 一级片成人 | 久久免费精品 | 欧美成人一区二区 | 91看片在线观看 | 久久精品免费看 | 欧美视频在线看 | 亚洲啪啪| 免费在线成人网 | 免费在线观看一级毛片 | 成人网av | 国产成人在线看 | 日本三级电影在线观看视频 | 国产精品久久久久久久久久久免费看 | 国产一区二区三区 | 精品91久久| 男人午夜视频 | 天天色图 | 在线国产视频 | 午夜精品久久久久久不卡欧美一级 | 三级av在线 | 日韩一二三 | 日韩二三区 | 亚洲日本欧美日韩高观看 | 亚洲综合在线一区 | 精品在线观看入口 | 男人的天堂avav | 国产成人综合一区二区三区 | 国产欧美精品 | 夜夜草视频 | 免费观看一级毛片 | 亚洲精色| 一区二区三区视频在线 | 91在线精品一区二区 | 亚洲一二三区精品 | 免费精品久久久久久中文字幕 | 免费看黄视频网站 | 久久国产精品久久久久久 | 日日碰碰| 亚洲三区在线播放 |