<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      深度學習(三)之LSTM寫詩

      1. 根據前文生成詩:

        機器學習業,圣賢不可求。臨戎辭蜀計,忠信盡封疆。天子咨兩相,建章應四方。自疑非俗態,誰復念鷦鷯。

      2. 生成藏頭詩:

        發初生光,三乘如太白。
        去冥冥沒,冥茫寄天海。
        書三十年,手把棼琴策。
        罷華省郎,憂人惜凋病。

      環境:

      • python:3.9.7
      • pytorch:1.11.0
      • numpy:1.21.2

      代碼地址:https://github.com/xiaohuiduan/deeplearning-study/tree/main/寫詩

      數據預處理

      數據集文件由3部分組成:ix2wordword2ixdata

      • ix2word:id到word的映射,如{23:'姑'},一共有8293個word。
      • word2ix2:word到id的映射,如
      • data:保存了詩的數據,一共有57580首詩,每條數據由125個word構成;如果詩的長度大于125則截斷,如果詩的長度小于125,則使用""進行填充。

      每條數據的構成規則為:</s></s></s>\(\dots\)<START>詩詞<EOP>

      在訓練的時候,不考慮填充數據,因此,將數據中的填充數據</s>去除,去除后,部分數據顯示如下:

      構建數據集

      模型輸入輸出決定了數據集怎么構建,下圖是模型的輸入輸出示意圖。詩詞生成實際上是一個語言模型,我們希望Model能夠根據當前輸入\(x_0,x_1,x_2\dots x_{n-1}\)去預測下一個狀態\(x_n\)。如圖中所示例子,則是希望在訓練的過程中,模型能夠根據輸入<START>床前明月光生成床前明月光,

      因此根據“<START>床前明月光,凝是地上霜。舉頭望明月,低頭思故鄉<EOP>”,可以生成如下的X和Y(seq_len=6)。

      X:<START>床前明月光,Y:床前明月光,

      X:,凝是地上霜,Y:凝是地上霜。

      X:。舉頭望明月,Y:舉頭望明月,

      X:,低頭思故鄉,Y:低頭思故鄉。

      代碼示意圖如下所示,seq_len代表每條訓練數據的長度。

      seq_len = 48
      X = []
      Y = []
      
      poems_data = [j for i in poems for j in i] # 將所有詩的內容變成一個一維數組
      
      for i in range(0,len(poems_data) - seq_len -1,seq_len):
          X.append(poems_data[i:i+seq_len])
          Y.append(poems_data[i+1:i+seq_len+1])
      

      模型結構

      模型結構如下所示,模型一共由3部分構成,Embedding層,LSTM層和全連接層。輸入數據首先輸入Embedding層,進行word2vec,然后將Word2Vec后的數據輸入到LSTM中,最后將LSTM的輸出輸入到全連接層中得到預測結果。

      模型構建代碼如下,其中在本文中embedding_dim=200,hidden_dim=1024

      import torch
      import torch.nn.functional as F
      import torch.nn as nn
      class PoemNet(nn.Module):
          def __init__(self, vocab_size, embedding_dim, hidden_dim):
              """
                  vocab_size:訓練集合字典大小(8293)
                  embedding_dim:word2vec的維度
                  hidden_dim:LSTM的hidden_dim
              """
              super(PoemNet, self).__init__()
              self.hidden_dim = hidden_dim
              self.embeddings = nn.Embedding(vocab_size, embedding_dim)
              self.lstm = nn.LSTM(embedding_dim, self.hidden_dim,batch_first=True)
      
              self.fc = nn.Sequential(
                  nn.Linear(self.hidden_dim,2048),
                  nn.ReLU(),
                  nn.Dropout(0.25),
                  
                  nn.Linear(2048,4096),
                  nn.Dropout(0.2),
                  nn.ReLU(),
                  nn.Linear(4096,vocab_size),
              )
      
          def forward(self, input,hidden=None):
              """
                  input:輸入的詩詞
                  hidden:在生成詩詞的時候需要使用,在pytorch中,如果不指定初始狀態h_0和C_0,則其
                  默認為0.
                  pytorch的LSTM的輸出是(output,(h_n,c_n))。實際上,output就是h_1,h_2,……h_n
              """
              embeds = self.embeddings(input)
              batch_size, seq_len = input.size()
              if hidden is None:
                  output, hidden = self.lstm(embeds)
              else:
                  # h_0,c_0 = hidden
                  output, hidden = self.lstm(embeds,hidden)
          
              output = self.fc(output)
              output = output.reshape(batch_size * seq_len, -1)
              output = F.log_softmax(output,dim=1)
              return output,hidden
      

      優化器使用的是Adam優化器,lr=0.001,損失函數是CrossEntropyLoss。訓練次數為100個epcoh。

      生成詩

      因為在模型構建的過程中,使用了dropout,所以在模型使用的時候,需要將model設置為eval模式。

      生成詩的邏輯圖:

      根據上文生成詩

      根據上圖的原理,寫出的代碼如下所示:

      def generate_poem(my_words,max_len=128):
          '''
              根據前文my_words生成一首詩。max_len表示生成詩的最大長度。
          '''
      
          def __generate_next(idx,hidden=None):
              """
                  根據input和hidden輸出下一個預測
              """
              input = torch.Tensor([idx]).view(1,1).long().to(device)
              output,hidden = my_net(input,hidden)
              return output,hidden
      
          # 初始化hidden狀態
          output,hidden = __generate_next(word2ix["<START>"])
          my_words_len = len(my_words)
          result = []
          for word in my_words:
              result.append(word)
              # 積累hidden狀態(h & c)
              output,hidden = __generate_next(word2ix[word],hidden)
          
          _,top_index = torch.max(output,1)
      
          word = idx2word[top_index[0].item()]
      
          result.append(word)
      
          for i in range(max_len-my_words_len):
              output,hidden = __generate_next(top_index[0].item(),hidden)
      
              _,top_index = torch.max(output,1)
              if top_index[0].item() == word2ix['<EOP>']: # 如果詩詞已經預測到結尾
                  break
              word = idx2word[top_index[0].item()]
              result.append(word)
          return "".join(result)
      
      generate_poem("睡覺")
      

      睡覺寒爐火,晨鐘坐中朝。爐煙沾煖露,池月靜清砧。自有傳心法,曾無住處傳。不知塵世隔,一覺一壺秋。皎潔垂銀液,浮航入綠醪。誰知舊鄰里,相對似相親。

      生成藏頭詩

      生成藏頭詩的方法與根據上文生成詩的方法大同小異。

      def acrostic_poetry(my_words):
          def __generate_next(idx,hidden=None):
              """
                  根據input和hidden輸出下一個預測詞
              """
              input = torch.Tensor([idx]).view(1,1).long().to(device)
              output,hidden = my_net(input,hidden)
              return output,hidden
      
          def __generate(word,hidden):
              """
                  根據word生成一句詩(以“。”結尾的話) 如根據床生成“床前明月光,凝是地上霜。”
              """
              generate_word = word2ix[word]
              sentence = []
              sentence.append(word)
              while generate_word != word2ix["。"]: 
                  output,hidden = __generate_next(generate_word,hidden)
                  _,top_index = torch.max(output,1)
                  generate_word = top_index[0].item()
                  sentence.append(idx2word[generate_word])
              # 根據"。"生成下一個隱狀態。
              _,hidden = __generate_next(generate_word,hidden)
              return sentence,hidden
      
          _,hidden = __generate_next(word2ix["<START>"])
          result = []
          for word in my_words:
              sentence,hidden = __generate(word,hidden)
              result.append("".join(sentence))
          print("\n".join(result))
      
      acrostic_poetry("滾去讀書")
      

      滾發初生光,三乘如太白。 去去冥冥沒,冥茫寄天海。 讀書三十年,手把棼琴策。 書罷華省郎,憂人惜凋病。

      參考

      posted @ 2022-04-04 21:43  渣渣輝啊  閱讀(1902)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 伊人欧美在线| 亚洲日韩国产精品第一页一区 | 色窝窝免费播放视频在线| 一区二区三区四区激情视频| 亚洲国产精品视频一二区| 国产精品久久久久久无毒不卡 | 国产AV福利第一精品| 少妇性l交大片| 国产精品伦人视频免费看| 国产69精品久久久久乱码免费| 国产精品久久露脸蜜臀| 污网站大全免费| 无码国产偷倩在线播放老年人 | 韩国福利片在线观看播放| 亚洲精品中文字幕一区二| 日韩黄色av一区二区三区| 亚洲日韩精品无码一区二区三区| 精品久久人人妻人人做精品| 加勒比无码人妻东京热| 亚洲第一国产综合| 亚洲av永久无码精品水牛影视 | 久久碰国产一区二区三区| 亚洲精品国产免费av| 亚洲精品精华液一区二区| 亚洲男人AV天堂午夜在| 巨熟乳波霸若妻在线播放| 国产精品一区在线蜜臀| 人妻有码av中文字幕久久琪| 亚洲欧美综合在线天堂| 亚洲av午夜福利精品一区二区| 精品无码三级在线观看视频| 一个人看的www视频免费观看| 亚洲国产精品人人做人人爱| 国产jjizz女人多水喷水| 在线中文字幕国产一区| 爱性久久久久久久久| 俺也来俺也去俺也射| 亚洲精品中文字幕码专区| 日本高清不卡一区二区三| 中文字幕人妻无码一区二区三区| 婷婷99视频精品全部在线观看 |