深度学习(三)之LSTM写诗

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 将PDF转为Excel

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 通常,PDF格式的文档能支持的编辑功能不如office文档多,针对PDF文档里面有表格数据的,如果…

SQL Server R2 地图报表制作(五)

SQL Server R2 地图报表制作(五) 2.3 向地图中添加线条层 在上述报表的基础上,我们接下来添加一个表示两个商店间路线的地图层,这里我们依旧使用SQL空间数据源,部分步骤与上一节类似,所不同的是相应的SQL语…

SQL Server 2005新特性之使用with关键字解决递归父子关系

1. 引言 现实项目中经常遇到需要处理递归父子关系的问题,如果把层次关系分开,放在多个表里通过主外键关系联接,最明显的问题就是扩展起来不方便,对于这种情况,一般我们会创建一个使用自连接的表来存放数据。例如存放会…

做订购系统必须要明白的几点

2019独角兽企业重金招聘Python工程师标准>>> 对价格的疑问? 1、用户容易把单位搞错,你标注的是单价,他理解的是整套的价格。譬如你标注的是一粒糖的价格,但卖的是一包糖10粒。 新增单?我拍了之后还想补充 2…

Oracle安装 - shmmax和shmall设置

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 一、概述 在Linux上安装oracle,需要对内核参数进行调整,其中有shmmax和shmall这两个参数&#xff…

彻底理解js中this的指向

首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部…

带码农《手写Mybatis》进度3:实现映射器的注册和使用

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获&…

01背包问题,动态规划求解

01背包问题: 1.递归思想 0- 1 背包问题如果采用递归算法来描述则非常清楚明白, 它的算法根本思想是假设用布尔函数knap( s, n) 表示n 件物品放入可容质量为s 的背包中是否有解( 当knap 函数的值为真时 说明问题有解,其值为假时无解) . 我们可以通过输入s 和n 的值, …

SonarQube代码质量管理平台安装与使用

SonarQube代码质量管理平台安装与使用 注原文地址:http://blog.csdn.net/hunterno4/article/details/11687269Sonar简介 Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量 通过插件形式,可…

docker容器编排原来这么丝滑~

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概念介绍&#xff1a…

互联网思维的“独孤九剑”

课前秀:三个段子 第一个段子:有一个毫无餐饮行业经验的人,他开了一家餐馆,菜品只有12道,在北京只有两家分店;仅两个月时间,就实现了所在商场餐厅坪效第一名;绿茶单位坪效大约是100元…

linux系统分析工具续-SystemTap和火焰图(Flame Graph)

本文为网上各位大神文章的综合简单实践篇,参考文章较多,有些总结性东西,自认暂无法详细写出,建议读文中列出的参考文档,相信会受益颇多。下面开始吧(本文出自 “cclo的博客” 博客,请务必保留此…

MySQL8.0.x 版本安装步骤傻瓜式教程【官方版】

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 MySQL8.0.x 安装 一、下载 MySQL官网下载链接:https://downloads.mysql.com/archives/community/ 选择版本后…

不用电的计算机(二)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 转载请注明出处:https://blog.csdn.net/morningli/p/16058594.html 上一篇讲到最早的计算机是什么样的&#xf…

CocoaPods did not set the base configuration of your project 问题解决方案

今天在使用pod install的时候,出现了 [!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configuration…

在UnityUI中绘制线状统计图

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 先来个效果图 觉得不好看可以自己调整 1.绘制数据点 线状图一般由数据点和连线组…

HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面

错误原因为 IIS 扩展信息中午此扩展 标签: 今天,在vs2013中新建了一个placard.json文件,当我用jq读取它的时候,去提示404,直接在浏览器访问这个文件,提示: HTTP 错误 404.3 – Not Found 由于扩…

一行代码,让 VS Code 内置 PDF 阅读器变成深色模式

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 许多人会用 VSCode 写 LaTeX,等等,都会用到 PDF 预览。VSCo…

Selenium2Library+ride学习笔记

一、环境部署 1.安装python2.7编译环境、ride环境以及Selenium2Library环境,环境部署可参见前面几节。 2.启动RIDE编译环境,导入Selenium2Library库。     3. 执行F5,可查看Selenium2Library自带的关键字(Keyword)。 二、常用关鍵字解释 1. open b…

Android——线程通讯 Handler、Looper、Message;

线程通讯问题 (主要用到了Handler类,Looper类和Message类以及MessageQueue) 在Android中主线程如何向子线程中发送消息的问题。让我们来想想,这其中的过程,无非就是创建一个Handler对象,然后一个线程发消息…