Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475
目录* 数据预处理

  • 构建数据集
  • 模型结构
  • 生成诗
    • 根据上文生成诗
    • 生成藏头诗
  • 参考

  1. 根据前文生成诗:

机器学习业,圣贤不可求。临戎辞蜀计,忠信尽封疆。天子咨两相,建章应四方。自疑非俗态,谁复念鹪鹩。

  1. 生成藏头诗:

步平生不愿君,古人今在古人风。

公既得忘机者,白首空山道姓名。

道不应无散处,未曾进退却还征。

环境:

  • 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的映射,如{‘姑’:23}
  • data:保存了诗的数据,一共有57580首诗,每条数据由125个word构成;如果诗的长度大于125则截断,如果诗的长度小于125,则使用""进行填充。

每条数据的构成规则为:…\dots诗词

在训练的时候,不考虑填充数据,因此,将数据中的填充数据去除,去除后,部分数据显示如下:

构建数据集

模型输入输出决定了数据集怎么构建,下图是模型的输入输出示意图。诗词生成实际上是一个语言模型,我们希望Model能够根据当前输入x0,x1,x2…xn−1x_0,x_1,x_2\dots x_{n-1}去预测下一个状态xnx_n。如图中所示例子,则是希望在训练的过程中,模型能够根据输入床前明月光生成床前明月光,

因此根据“床前明月光,凝是地上霜。举头望明月,低头思故乡”,可以生成如下的X和Y(seq_len=6)。

X:床前明月光,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_dimself.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 = hiddenoutput, 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[""])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['']: # 如果诗词已经预测到结尾breakword = 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,hiddendef \_\_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[""])result = []for word in my_words:sentence,hidden = __generate(word,hidden)result.append("".join(sentence))print("\n".join(result))acrostic_poetry("滚去读书")

滚发初生光,三乘如太白。 去去冥冥没,冥茫寄天海。 读书三十年,手把棼琴策。 书罢华省郎,忧人惜凋病。

参考

  • 简单明朗的 RNN 写诗教程 - 段小辉 - 博客园 (cnblogs.com)
  • LSTM — PyTorch 1.11.0 documentation
  • Embedding — PyTorch 1.11.0 documentation

深度学习(三)之LSTM写诗相关推荐

  1. 推荐系统遇上深度学习(三十九)-推荐系统中召回策略演进!

    推荐系统中的核心是从海量的商品库挑选合适商品最终展示给用户.由于商品库数量巨大,因此常见的推荐系统一般分为两个阶段,即召回阶段和排序阶段.召回阶段主要是从全量的商品库中得到用户可能感兴趣的一小部分候选 ...

  2. 深度学习三巨头共获 2018 年图灵奖(经典重温)!

    整理 | 琥珀 出品 | AI科技大本营(ID:rgznai100) 2019 年 3 月 27 日,ACM 宣布,深度学习三位大牛 Yoshua Bengio.Yann LeCun.Geoffrey ...

  3. 2020届 AAAI Fellow名单新鲜出炉!!!深度学习三巨头终于齐聚

    点击上方"深度学习技术前沿",选择"星标"公众号 资源干货,第一时间送达 AAAI 是国际人工智能领域最权威的学术组织,Fellow 是该学会给予会员的最高荣誉 ...

  4. 实至名归!ACM宣布深度学习三巨头共同获得图灵奖

    昨日晚间,ACM(国际计算机学会)宣布,有"深度学习三巨头"之称的Yoshua Bengio.Yann LeCun.Geoffrey Hinton共同获得了2018年的图灵奖,这是 ...

  5. 【技术综述】图像与CNN发家简史,集齐深度学习三巨头

    文章首发于微信公众号<有三AI> [技术综述]图像与CNN发家简史,集齐深度学习三巨头 没有一个经典的发现会是突然之间横空出世,它总是需要一些积淀. 提起卷积神经网络,我们总会从LeNet ...

  6. 深度学习“三巨头”、图灵奖得主 Yann LeCun:我没有天赋,所以才追随聪明人...

    Yann LeCun 作者 | 胡巍巍 出品 | 程序人生(ID:coder_life) "彻头彻尾的骗局." 2018年初,历史上首个获得公民身份的机器人索菲亚,又是上节目,又是 ...

  7. 图灵奖颁给深度学习三巨头,他们曾是一小撮顽固的“蠢货”

    栗子 安妮 乾明 发自 凹非寺  量子位 报道 | 公众号 QbitAI 深度学习三巨头成为新晋图灵奖得主! ACM刚刚官宣,Yoshua Bengio.Geoffrey Hinton.Yann Le ...

  8. 深度学习三十年创新路

    深度学习三十年创新路 编者注:深度学习火了,从任何意义上,大家谈论它的热衷程度,都超乎想象.但是,似乎很少有人提出不同的声音,说深度学习的火热,有可能是过度的繁荣,乃至不理性的盲从.而这次,有不同的想 ...

  9. 昨日种种已得奖,那深度学习三巨头今天在忙什么?

    上周,AI圈最大的事情,没有之一,就是图灵奖,终于终于,终于颁给了深度学习三巨头. 关于Geoffrey Hinton和他的两位学生Yoshua Bengio.Yann LeCun的故事,在消息出来后 ...

  10. 深度学习还没入门?看看深度学习三巨头的Deep Learning综述(4)

    深度学习还没入门?看看深度学习三巨头的Deep Learning综述(1) 深度学习还没入门?看看深度学习三巨头的Deep Learning综述(2) 深度学习还没入门?看看深度学习三巨头的Deep ...

最新文章

  1. 【Hibernate步步为营】--多对多映射详解
  2. fstream下的读写操作
  3. STB Reason: can‘t fopen
  4. pat上写java程序_如何运行Java程序和设置CLASSPAT
  5. AAAI'22 | 基于Profile信息的口语语言理解基准
  6. 从携程事件给我们警示
  7. nginx 部署前端项目
  8. 从零编写linux0.11 - 第七章 完善终端
  9. 鸿蒙时代最厉害的武器,中国神话兵器实力排行榜 最厉害的神话武器有哪些
  10. 苹果自带浏览器显示无法连接服务器,为什么苹果自带浏览器无法连接到服务器怎么解决...
  11. 微信公众号历史文章采集
  12. how to assign more that 31 VFs to one VM
  13. MyEclipse 8.5 6.x 最新注册码(有效期至2016年)
  14. Bitbucket使用说明与SourceTree的使用
  15. win7怎么显示后缀名
  16. ng-zorro 升级后 nz-table 增删数据异常
  17. MATLAB Robotic System Toolbox 机械臂科氏矩阵算法
  18. ZSTU月赛 1912: 我好像不会做(模拟)
  19. F12 开发人员工具调试 HTML 和 CSS
  20. 彩虹瓶 (25 分)

热门文章

  1. Golang 交叉编译
  2. eclipse maven scm
  3. 回车(CR)与换行(LF), '\r'和'\n'的区别
  4. 深入分析Flex [Bindable] (总结)
  5. php 获取当天到23 59,js 获取当天23点59分59秒 时间戳 (最简单的方法)
  6. 458. 可怜的小猪
  7. istio 和 kong_如何启动和运行Istio
  8. 腾讯哈勃_用Python的黑客统计资料重新审视哈勃定律
  9. hdf5文件和csv的区别_使用HDF5文件并创建CSV文件
  10. Go-json解码到接口及根据键获取值