Python|用Python语言模型和LSTM做一个Drake饶舌歌词生成器( 二 )
这篇文章主要关注字符级模型 , 因为它更易于实施和理解 , 也更容易转化为复杂的词汇级模型 。
数据预处理
针对字符级模型 , 我们将按照以下步骤进行数据预处理:
1.标记字符
对字符级模型而言 , 输入应该是基于字符而非字符串的形式 。 所以 , 我们首先要将歌词的每一行转变成字符的集合 。
2.定义字符表
上一步 , 我们获得了歌词中所有可能出现的字符 , 接下来需要找出所有独特的字符 。 由于整个数据集并不大(只有140首歌) , 简单起见 , 我只保留所有英文字母以及一些特殊符号(比如空格) , 而忽略数字和其他的信息(因为数据集很小 , 我宁愿让模型少预测一些字符) 。
3.创建训练序列
这里我们会用到滑动窗口的概念 。 通过沿着句子拖动一个固定长度的窗口 , 我们将建立用于训练的数据序列 。 下面的这张图很好地展示了滑动窗口的操作:
文章插图
图4. 用滑动窗口获得输入/输出
我们通过每次平移一个字符 , 得到相应长度为20个字符的模型输入和长度为1个字符的模型输出 。 每次只平移一格的额外好处就是大大扩展了数据集的大小 。
4.标注编码训练序列
最后 , 我们不想直接处理原始字符(尽管理论上讲每个字符都是一个数字 , 所以你也可以说ASCII码已经帮我们为每个字符完成了编码) 。 我们要做的是用唯一的数字和每个字符一一对应 , 这一步就是所谓的标签编码 。 同时 , 我们要建立两个非常重要的映射:character-to-index (字符到索引)和index-to-character(索引到字符) 。 有了这两个映射 , 我们就能将字母表中任意的字符编码成对应的数字 , 同理 , 也能将模型输出的数字索引解码获得相应的字符 。
5.数据集的独热编码
因为我们用的是分类数据 , 就是说所有字符都可以被归为某个类别 , 所以我们要将字符编码成输入列的形式 。
当我们完成以上五个步骤以后 , 基本就大功告成了 , 接下来只需要搭建和训练模型 。 如果你想深入更多细节 , 以下是五个步骤的代码供参考 。
文章插图
3.建立模型
我们将用循环神经网络(RNN) , 更具体的说是长短期记忆网络(LSTM) , 基于前面出现的字符集来预测下一个字符 。 如果这两个概念都听着陌生的话 , 我也提供了相关概念的快速复习:
RNN快速复习
通常 , 你看到的网络就是一个网状 , 从很多点汇聚到一个单点输出 。 如下图所示:
文章插图
图5. 神经网络示意图
这里的神经网络是单点输入 , 单点输出 。 它适用于输入是不连续的情况 , 因为输入的顺序不会影响到输出结果 。 但是在我们的案例中 , 输入字符的顺序是非常重要的 , 因为顺序决定了对应的单词 。
而RNN可以接收连续的输入 , 同时将前一个节点的输出作为参数输入下一个节点 , 从而解决输入顺序的问题 。
文章插图
图6. 简易RNN示意图
例如 , 基于序列Tryna_keep_it_simple , 提取的下一个字符就应该是 _ 。 这正是我们想让神经网络做的 。 神经网络的输入将是 T?—?> x<1>, r -> x<2>, n -> x<3>... e-> x
LSTM快速复习
简单的RNN网络仍存在一些问题 , 它不善于将非常前端的元胞信息传递到后端元胞 。 例如 , 句子Tryna keep it simple is a struggle for me中最后一个词me , 如果不往回看前面出现了什么单词 , 那么这个单词是很难预测准确的(很可能就被预测成了Baka , cat , potato之类) 。
而LSTM能够很好地解决这个问题 , 它在每个元胞中存储部分前面发生的事件信息(即前面出现的单词) 。 如下图所示:
文章插图
图7. LSTM示意图 , 摘自Andrew Ng的深度学习课程
不仅传递前一个元胞的输出a
编程建模
我之前学过一点Keras , 所以这次就以Keras为框架编程搭建模型 。 其实也可以选择自己搭建模型框架 , 但这样会花费更多的时间 。
- 看不上|为什么还有用户看不上华为Mate40系列来看看内行人怎么说
- 采用|消息称一加9系列将推出三款新机,新增一加9E
- 会员|美容院使用会员管理软件给顾客更好的消费体验!
- 行业|现在行业内客服托管费用是怎么算的
- 闲鱼|电诉宝:“闲鱼”网络欺诈成用户投诉热点 Q3获“不建议下单”评级
- 美国|英国媒体惊叹:165个国家采用北斗将GPS替代,连美国也不例外?
- 桌面|日常使用的软件及网站分享 篇一:几个动态壁纸软件和静态壁纸网站:助你美化你的桌面
- 同轴心配合|用SolidWorks画一个直角传动,画四个零件就行
- 先别|用了周冬雨的照片,我会成为下一个被告?自媒体创作者先别自乱阵脚
- 速度|华为P50Pro或采用很吓人的拍照技术:液体镜头让对焦速度更快