全文共5945字,预计学习时长15分钟
图源:unsplash
还在等待霍格沃茨的录取通知书?想在大礼堂里享用晚宴?探索霍格沃茨的秘密通道?在奥利凡德魔杖店买第一根魔杖?叹气,你不是一个人。这么久了,我还是沉迷于哈利波特的魔法世界。
最近我开始学习神经网络,着迷于深度学习的强大创造力。灵光乍现,我为什么不把它们融合在一起呢?因此,我使用TensorFlow执行了一个简单的文本生成模型来创作我自己的《哈利·波特》短篇小说。
本文将介绍了我为实现它而编写的完整代码。各位巫师可以在这里直接找到github代码并自己运行它:https://github.com/amisha-jodhani/text-generator-harry-potter
当你闲来无事时,它可以向无聊施一个驱逐咒。
背景
RNN是什么?
循环神经网络(RNN)与其他神经网络不同,它是有记忆的神经网络,可以存储它处理过的所有层的信息,并在记忆的基础上计算下一层。
GRU vs LSTM
二者在文本生成上都表现出色,GRU(门控循环单元)是比较新的概念,实际上并没有一种方法可以确定二者哪个更好。优化超参数比选择一个好的架构更能提高模型性能。
如果数据量不成问题,那么则是LSTM(长短期记忆网络)性能更优。如果数据量较少,那么GRU参数更少,因此训练更快,并能很好地泛化。
为什么是基于字符的?
在处理这样的大型数据集时,一个语料库中不重复单词的总量远远高于唯一字符的数量。一个大型数据集有许多不重复的单词,当为如此大的矩阵分配独热编码时,很可能会遇到内存问题。光是标签本身就可以占据Tb级的内存。
用来预测单词的原则也可以应用在这里,但是现在要处理的词汇量要小得多。
代码
图源:unsplash
首先导入所需的库
import tensorflow as tfimport numpy as npimport osimport time
现在,读取数据
可以从 一个Kaggle数据集找到并下载所有《哈利波特》的文稿(https://www.kaggle.com/alex44jzy/harrypotter)。我将这七本书合并到一个名为“harrypotter.txt”的文本文件中,你也可以挑选你喜欢的任何一本来训练模型。
files= [‘1SorcerersStone.txt’, ‘2ChamberofSecrets.txt’, ‘3ThePrisonerOfAzkaban.txt’,‘4TheGobletOfFire.txt’, ‘5OrderofthePhoenix.txt’, ‘6TheHalfBloodPrince.txt’,‘7DeathlyHollows.txt’]with open(‘harrypotter.txt’, ‘w’) as outfile:for file in files: with open(file) as infile: outfile.write(infile.read())text = open(‘harrypotter.txt’).read()
查看数据
print(text[:300])
处理数据
通