NLP人工智能写诗模型之李小白

本文介绍了一个使用LSTM神经网络训练的诗歌生成模型,名为李小白。模型通过学习大量诗词,能够根据输入的第一个字生成一首诗。数据预处理包括过滤、排序、词表编码等步骤,网络结构为双层LSTM,训练过程包含批次管理和梯度截断。通过模型,作者探讨了人工智能创作与人类智慧的相似性。
摘要由CSDN通过智能技术生成

 

1.前言

              我希望我的技术是有温度的,也许是生活已经足够冰冷。我希望赋予我的模型以生命,它们在那个虚拟世界里面的生活,又何尝不跟我们这个所谓真实的世界一样呢?所以我叫他李小白,因为我喜欢那句‘乘风破浪会有时,直挂云帆济沧海’。

2.目标

               我们希望得到这样一个模型,当我输入第一个字的时候,她可以用这个字开头为我做一首诗。

3.思路

                我们会让模型读上万首诗,他会从中学习到一种能力,写诗。无关意境、无关思想、只是为了好玩。我们使用LSTM循环神经网络作为隐层,基本网络结构为输入层——>LSTM——>LSTM——>输出层;

4.数据预处理

              1.我们的训练数据总共有43030行,每一行代表一首诗词。格式为‘标题:内容’如下:
                     静夜思:床前明月光,疑是地上霜。举头望明月,低头思故乡。
              2.预处理
                   1)将每行诗的内容(不包含标题),加入到poetrys向量中。过滤掉少于5个字的和大于79个字的诗,去掉特殊字符,每行内容添加'['、']'作为开始和结束标签。过滤完后剩下34646首诗
                   2)按照每行诗内容的长度,对poetrys向量进行排序
                   3)生成词表,按照每个字出现的次数对其进行编码,出现次数越多则编码越小
                   4)根据词表,将诗集poetrys转换为数字形式
                   5)准备训练数据,加载所有批次的数据,对于每个批次来说,x为批次数量的诗句,诗句的长度为该批次中最长的诗句长度。y为x去掉第一位重复最后一位得到的诗句。

                    6)使用嵌入层对每个词向量进行one-hot编码,并且编码后的向量使用隐层嵌入矩阵映射为一个稠密向量。

5.RNN网络

                1.我们使用两层的LSTM网络, 隐层神经元128个。

                 2.优化器使用adam

                 3.损失函数还是选择传统的softmax,对于一个批次中的所有数据loss进行累积,然后求平均

6.训练

                 1.每个批次有256条数据,训练50个轮次,每隔7个轮次保存一次生成的模型。
                            学习率衰减为:0.002 * (0.97 ** epoch)
                  2.为了防止梯度爆炸和梯度消失,对于计算出来的梯度进行了截取,使用tf.clip_by_global_norm,截取率设置为5
                           

7.预测

                高阵明日自有碛,

                来有纤城还惟。

                谁玄骚市看情烟,

                欲雨清婺纵砚山。

                这个模型在GTX1050显卡上训练了20分钟,上面的例子我给出了首个字高,李小白同学就为我输出了这首诗;我自己的水平有限,不敢妄加评论。也许我们的模型没有经历过挫折与坎坷,写不出那样‘念天地之悠悠,独怆然而涕下’的诗句。但是 从本质上讲,人类通过学习知识,能出口成章,这跟模型是没有什么区别的。也许当我们真正找到自己跟模型不一样的地方的那天,我们也就找到了真正的自己吧!各位看官如果心情不好的话,看一下下面这个伟大的视频,杨超越真的超级可爱!

【火箭少女解散】杨超越告别感言太好笑了!!哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈明明是很伤心的事,看得我又哭又笑的杨超越:“我真是干啥啥不行,跟老板吵架第一名”

       

8.代码

1.训练代码

import collections
import numpy as np
import tensorflow as tf

# -------------------------------数据预处理---------------------------#
poetry_file = 'poetry.txt'
#poetry_file = './data/poetry.txt'

# 诗集
poetrys = []
#加载诗集到一个数组,对于特殊字符进行处理,并且对于每行诗左右添加[]
with open(poetry_file, "r", encoding='utf-8', ) as f:
    for line in f:
        try:
            title, content = line.strip().split(':')
            content = content.replace(' ', '')
            if '
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值