国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

用 PyTorch 實現基于字符的循環神經網絡

人工智能 深度學習
在過去的幾周里,我花了很多時間用 PyTorch 實現了一個 char-rnn 的版本。我以前從未訓練過神經網絡,所以這可能是一個有趣的開始。

在過去的幾周里,我花了很多時間用 PyTorch 實現了一個 char-rnn 的版本。我以前從未訓練過神經網絡,所以這可能是一個有趣的開始。

這個想法(來自 循環神經網絡的不合理效應 )可以讓你在文本上訓練一個基于字符的 循環神經網絡(recurrent neural network)(RNN),并得到一些出乎意料好的結果。

[[358756]]

不過,雖然沒有得到我想要的結果,但是我還是想分享一些示例代碼和結果,希望對其他開始嘗試使用 PyTorch 和 RNN 的人有幫助。

這是 Jupyter 筆記本格式的代碼: char-rnn in PyTorch.ipynb 。你可以點擊這個網頁最上面那個按鈕 “Open in Colab”,就可以在 Google 的 Colab 服務中打開,并使用免費的 GPU 進行訓練。所有的東西加起來大概有 75 行代碼,我將在這篇博文中盡可能地詳細解釋。

第一步:準備數據

首先,我們要下載數據。我使用的是 古登堡項目(Project Gutenberg)中的這個數據: Hans Christian Anderson’s fairy tales 。

  1. !wget -O fairy-tales.txt 

這個是準備數據的代碼。我使用 fastai 庫中的 Vocab 類進行數據處理,它能將一堆字母轉換成“詞表”,然后用這個“詞表”把字母變成數字。

之后我們就得到了一個大的數字數組(training_set),我們可以用于訓練我們的模型。

  1. from fastai.text import * 
  2. text = unidecode.unidecode(open('fairy-tales.txt').read()) 
  3. v = Vocab.create((x for x in text), max_vocab=400min_freq=1
  4. training_set = torch.Tensor(v.numericalize([x for x in text])).type(torch.LongTensor).cuda() 
  5. num_letters = len(v.itos) 

第二步:定義模型

這個是 PyTorch 中 LSTM 類的封裝。除了封裝 LSTM 類以外,它還做了三件事:

  • 對輸入向量進行 one-hot 編碼,使得它們具有正確的維度。
  • 在 LSTM 層后一層添加一個線性變換,因為 LSTM 輸出的是一個長度為 hidden_size 的向量,我們需要的是一個長度為 input_size 的向量這樣才能把它變成一個字符。
  • 把 LSTM 隱藏層的輸出向量(實際上有 2 個向量)保存成實例變量,然后在每輪運行結束后執行 .detach() 函數。(我很難解釋清 .detach() 的作用,但我的理解是,它在某種程度上“結束”了模型的求導計算)(LCTT 譯注:detach() 函數是將該張量的 requires_grad 參數設置為 False,即反向傳播到該張量就結束。)
  1. class MyLSTM(nn.Module): 
  2.     def __init__(self, input_size, hidden_size): 
  3.         super().__init__() 
  4.         self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True
  5.         self.h2o = nn.Linear(hidden_size, input_size) 
  6.         self.input_size=input_size 
  7.         self.hidden = None 
  8.  
  9.     def forward(self, input): 
  10.         input = torch.nn.functional.one_hot(input, num_classes=self.input_size).type(torch.FloatTensor).cuda().unsqueeze(0) 
  11.         if self.hidden is None: 
  12.             l_output, selfself.hidden = self.lstm(input) 
  13.         else: 
  14.             l_output, selfself.hidden = self.lstm(input, self.hidden) 
  15.         self.hidden = (self.hidden[0].detach(), self.hidden[1].detach()) 
  16.  
  17.         return self.h2o(l_output) 

這個代碼還做了一些比較神奇但是不太明顯的功能。如果你的輸入是一個向量(比如 [1,2,3,4,5,6]),對應六個字母,那么我的理解是 nn.LSTM 會在內部使用 沿時間反向傳播 更新隱藏向量 6 次。

第三步:編寫訓練代碼

模型不會自己訓練的!

我最開始的時候嘗試用 fastai 庫中的一個輔助類(也是 PyTorch 中的封裝)。我有點疑惑因為我不知道它在做什么,所以最后我自己編寫了模型訓練代碼。

下面這些代碼(epoch() 方法)就是有關于一輪訓練過程的基本信息。基本上就是重復做下面這幾件事情:

  • 往 RNN 模型中傳入一個字符串,比如 and they ought not to teas。(要以數字向量的形式傳入)
  • 得到下一個字母的預測結果
  • 計算 RNN 模型預測結果和真實的下一個字母之間的損失函數(e,因為 tease 這個單詞是以 e 結尾的)
  • 計算梯度(用 loss.backward() 函數)
  • 沿著梯度下降的方向修改模型中參數的權重(用 self.optimizer.step() 函數)
  1. class Trainer(): 
  2.   def __init__(self): 
  3.       self.rnn = MyLSTM(input_size, hidden_size).cuda() 
  4.       self.optimizer = torch.optim.Adam(self.rnn.parameters(), amsgrad=Truelrlr=lr) 
  5.   def epoch(self): 
  6.       i = 0 
  7.       while i < len(training_set) - 40: 
  8.         seq_len = random.randint(10, 40) 
  9.         input, target = training_set[i:i+seq_len],training_set[i+1:i+1+seq_len] 
  10.         i += seq_len 
  11.         # forward pass 
  12.         output = self.rnn(input) 
  13.         loss = F.cross_entropy(output.squeeze()[-1:], target[-1:]) 
  14.         # compute gradients and take optimizer step 
  15.         self.optimizer.zero_grad() 
  16.         loss.backward() 
  17.         self.optimizer.step() 

使用 nn.LSTM 沿著時間反向傳播,不要自己寫代碼

開始的時候我自己寫代碼每次傳一個字母到 LSTM 層中,之后定期計算導數,就像下面這樣:

  1. for i in range(20): 
  2.     input, target = next(iter) 
  3.     output, hidden = self.lstm(input, hidden) 
  4. loss = F.cross_entropy(output, target) 
  5. hiddenhidden = hidden.detach() 
  6. self.optimizer.zero_grad() 
  7. loss.backward() 
  8. self.optimizer.step() 

這段代碼每次傳入 20 個字母,每次一個,并且在最后訓練了一次。這個步驟就被稱為 沿時間反向傳播 ,Karpathy 在他的博客中就是用這種方法。

這個方法有些用處,我編寫的損失函數開始能夠下降一段時間,但之后就會出現峰值。我不知道為什么會出現這種現象,但之后我改為一次傳入 20 個字符到 LSTM 之后(按 seq_len 維度),再進行反向傳播,情況就變好了。

第四步:訓練模型!

我在同樣的數據上重復執行了這個訓練代碼大概 300 次,直到模型開始輸出一些看起來像英文的文本。差不多花了一個多小時吧。

這種情況下我也不關注模型是不是過擬合了,但是如果你在真實場景中訓練模型,應該要在驗證集上驗證你的模型。

第五步:生成輸出!

最后一件要做的事就是用這個模型生成一些輸出。我寫了一個輔助方法從這個訓練好的模型中生成文本(make_preds 和 next_pred)。這里主要是把向量的維度對齊,重要的一點是:

  1. output = rnn(input) 
  2. prediction_vector = F.softmax(output/temperature) 
  3. letter = v.textify(torch.multinomial(prediction_vector, 1).flatten(), sep='').replace('_', ' ') 

基本上做的事情就是這些:

  • RNN 層為字母表中的每一個字母或者符號輸出一個數值向量(output)。
  • 這個 output 向量并不是一個概率向量,所以需要 F.softmax(output/temperature) 操作,將其轉換為概率值(也就是所有數值加起來和為 1)。temperature 某種程度上控制了對更高概率的權重,在限制范圍內,如果設置 temperature=0.0000001,它將始終選擇概率最高的字母。
  • torch.multinomial(prediction_vector) 用于獲取概率向量,并使用這些概率在向量中選擇一個索引(如 12)。
  • v.textify 把 12 轉換為字母。

如果我們想要處理的文本長度為 300,那么只需要重復這個過程 300 次就可以了。

結果!

我把預測函數中的參數設置為 temperature = 1 得到了下面的這些由模型生成的結果。看起來有點像英語,這個結果已經很不錯了,因為這個模型要從頭開始“學習”英語,并且是在字符序列的級別上進行學習的。

雖然這些話沒有什么含義,但我們也不知道到底想要得到什么輸出。

“An who was you colotal said that have to have been a little crimantable and beamed home the beetle. “I shall be in the head of the green for the sound of the wood. The pastor. “I child hand through the emperor’s sorthes, where the mother was a great deal down the conscious, which are all the gleam of the wood they saw the last great of the emperor’s forments, the house of a large gone there was nothing of the wonded the sound of which she saw in the converse of the beetle. “I shall know happy to him. This stories herself and the sound of the young mons feathery in the green safe.”

“That was the pastor. The some and hand on the water sound of the beauty be and home to have been consider and tree and the face. The some to the froghesses and stringing to the sea, and the yellow was too intention, he was not a warm to the pastor. The pastor which are the faten to go and the world from the bell, why really the laborer’s back of most handsome that she was a caperven and the confectioned and thoughts were seated to have great made

下面這些結果是當 temperature=0.1 時生成的,它選擇字符的方式更接近于“每次都選擇出現概率最高的字符”。這就使得輸出結果有很多是重復的。

ole the sound of the beauty of the beetle. “She was a great emperor of the sea, and the sun was so warm to the confectioned the beetle. “I shall be so many for the beetle. “I shall be so many for the beetle. “I shall be so standen for the world, and the sun was so warm to the sea, and the sun was so warm to the sea, and the sound of the world from the bell, where the beetle was the sea, and the sound of the world from the bell, where the beetle was the sea, and the sound of the wood flowers and the sound of the wood, and the sound of the world from the bell, where the world from the wood, and the sound of the

這段輸出對這幾個單詞 beetles、confectioners、sun 和 sea 有著奇怪的執念。

總結!

至此,我的結果遠不及 Karpathy 的好,可能有一下幾個原因:

  • 沒有足夠多的訓練數據。
  • 訓練了一個小時之后我就沒有耐心去查看 Colab 筆記本上的信息。
  • Karpathy 使用了兩層LSTM,包含了更多的參數,而我只使用了一層。
  • 完全是另一回事。

但我得到了一些大致說得過去的結果!還不錯!

 

責任編輯:趙寧寧 來源: Linux中國
相關推薦

2017-04-26 08:31:10

神經網絡自然語言PyTorch

2022-07-28 09:00:00

深度學習網絡類型架構

2024-11-05 16:19:55

2020-09-18 11:40:44

神經網絡人工智能PyTorch

2024-04-30 14:54:10

2023-03-03 08:17:28

神經網絡RNN網絡

2019-08-19 00:31:16

Pytorch神經網絡深度學習

2025-02-25 14:13:31

2020-09-08 13:02:00

Python神經網絡感知器

2022-10-19 07:42:41

圖像識別神經網絡

2018-07-29 06:46:07

神經網絡RNN循環神經網絡

2025-02-19 15:12:17

神經網絡PyTorch大模型

2022-06-16 10:29:33

神經網絡圖像分類算法

2017-12-14 21:17:24

2018-12-20 11:38:37

神經元神經網絡語言

2017-07-07 15:46:38

循環神經網絡視覺注意力模擬

2017-08-28 21:31:37

TensorFlow深度學習神經網絡

2021-12-28 08:48:54

PyTorch神經網絡人工智能

2018-07-03 16:10:04

神經網絡生物神經網絡人工神經網絡

2022-04-22 12:36:11

RNN神經網絡)機器學習
點贊
收藏

51CTO技術棧公眾號

一级特黄特色的免费大片| 日韩精品无码一区二区三区免费| 成人在线黄色电影| 色哟哟国产精品| 男女午夜刺激视频| 成人午夜免费电影| 色播亚洲婷婷| 黄色av一区| 国产精品一区二区久久| 91午夜精品| 精品欧美aⅴ在线网站| 日韩一区免费| a91a精品视频在线观看| 国产精品日韩欧美综合| 日韩中文在线| 青草伊人久久| 奇米在线7777在线精品| 精品欧美国产| 激情国产一区| 鲁丝片一区二区三区| 国产精品试看| 翔田千里亚洲一二三区| 日本美女视频一区二区| 亚洲精品影院| 国内精品免费在线观看| 国产精品啪啪啪视频| 国产一区二区三区美女| av在线com| 91农村精品一区二区在线| jizz欧美激情18| 中文字幕一区二| 国产女主播在线观看| 亚洲va欧美va天堂v国产综合| 国产精品粉嫩av| 日韩欧美第一页| 九七久久人人| 日韩精品久久久久久久玫瑰园| 26uuu亚洲电影| 欧美巨大黑人极品精男| 久久a爱视频| 国产综合色香蕉精品| 一区二区动漫| 一级性生活视频| 日本一区二区免费在线| 久草在线资源视频| 91精品国产综合久久香蕉麻豆| 老色鬼在线视频| 久久天天躁狠狠躁夜夜躁2014| 精品三级在线观看视频| 91九色精品视频| 日韩中文字幕麻豆| 自慰无码一区二区三区| 亚洲美女屁股眼交| 在线国产情侣| 自拍偷拍亚洲欧美| 久久国产成人精品| 亚洲成人蜜桃| 欧美韩国日本综合| 麻豆app在线观看| 亚洲精品久久在线| 国产96在线亚洲| 国产精品乱子乱xxxx| 国产成人在线视频免费播放| 99热最新网址| 欧美综合视频在线观看| 国产91亚洲精品久久久| 成人欧美在线视频| 精品一区二区三区影院在线午夜 | yiren22亚洲综合伊人22| 欧美精品一区二区蜜臀亚洲| 日本免费一区二区三区视频| 91亚洲精华国产精华| 成人国产精品免费| 国产黄色片在线观看| 久久亚洲影音av资源网| 樱桃成人精品视频在线播放| 日韩亚洲欧美视频| 色综合视频在线观看| 香蕉成人在线| 久久精品日韩精品| 亚洲视频一区二区在线| 亚洲一二三四| 国产精品免费观看高清| 中文字幕不卡三区| 狠狠躁少妇一区二区三区| 国产精品入口福利| 国产成人亚洲综合a∨婷婷图片| 在线看的你懂得| 精品久久久av| 一区三区视频| 黄色毛片视频| 久久躁日日躁aaaaxxxx| 日韩高清不卡在线| 在线免费观看你懂的| 超碰日本道色综合久久综合| 免费久久99精品国产| 青柠在线影院观看日本| 欧美激情aaaa| 国产成人在线免费| 国产人成网在线播放va免费| 国产精品主播视频| 国产情人综合久久777777| 麻豆mv在线观看| 欧美亚洲爱爱另类综合| 精品高清美女精品国产区| 激情视频极品美女日韩| 精品少妇一区二区三区在线| 精品亚洲一区二区| 欧美一级久久| 色网站在线看| 97在线电影| 精品国产91久久久久久| 亚洲品质自拍| heyzo在线观看| 午夜精品在线视频| 国产亚洲精品福利| 国产日韩一区二区三免费高清| 一级全黄肉体裸体全过程| 欧美一卡二卡三卡| 在线亚洲一区| 韩国av网站在线| 国产精品国产精品| 色综合天天综合网国产成人综合天| 国产精品欧美在线观看| 男捅女免费视频| 欧美在线一级视频| 亚洲精品午夜久久久| 国产精品一区二区三区av麻 | 不卡的av网站| 黄色日韩网站| 狠狠干 狠狠操| 色黄久久久久久| av激情亚洲男人天堂| 国产激情欧美| 日韩avxxx| 久久久久国产精品一区| 日本一区二区成人在线| 色爱综合av| 亚洲精品视频在线免费| 91精品久久香蕉国产线看观看| 日韩欧美中文第一页| 国产日韩欧美高清免费| 岛国片av在线| 91丨porny丨探花| 欧美成人自拍视频| 亚洲精品你懂的| 亚洲区综合中文字幕日日| 77777影视视频在线观看| 欧美中日韩免费视频| 亚洲国产精品人人爽夜夜爽| 福利一区二区在线| 久久伊人精品| 最新中文字幕在线观看| 国产三区精品| 亚洲国产精品久久久久| 99久久亚洲一区二区三区青草| 久久影院资源站| 中文字幕中文字幕在线中文字幕三区 | 中文字幕亚洲字幕| 久久综合九色欧美综合狠狠| 四虎5151久久欧美毛片| 三级视频在线播放| 欧美一级二级三级| 国产小视频91| 中文字幕在线观看不卡视频| 中文字幕一区二区三区欧美日韩| 国产在线更新| 五月丁香综合缴情六月小说| 26uuu亚洲国产精品| 欧美丝袜丝交足nylons| 国产一区二区精品久久91| 97青娱国产盛宴精品视频| 色综合久久网女同蕾丝边| 日韩视频在线播放| 日韩在线观看精品| 五月婷婷久久丁香| 精一区二区三区| 真实原创一区二区影院| 精产国品自在线www| 自慰无码一区二区三区| 国产日韩中文字幕| 日韩精品在线播放| 一区二区三区在线影院| 日韩成人一级大片| 亚洲精品456| 国产拍在线视频| 毛片中文在线观看| 亚洲黄色一区二区三区| 奇门遁甲1982国语版免费观看高清| 欧美日韩一区国产| 亚洲国产精品99久久久久久久久 | av一区二区不卡| 久久福利综合| 怡红院成人在线| 欧美日韩影视| 免费看国产曰批40分钟| 国产精品视频免费一区二区三区| 日韩中文娱乐网| 欧美亚洲免费在线一区| 国产日韩v精品一区二区|