首发于 人工智能学习笔记
起名字这个技术活,终于用Pytorch找到解决办法了!

起名字这个技术活,终于用Pytorch找到解决办法了!

本文由集智小仙女发表在集智AI学园公众号上,欢迎关注集智AI学园微信公众号:swarmAI。

上节课我们使用深度学习技术创造了一个 会写嘻哈说唱词的 AI,这节课我们使用类似的方法,再创建一个 AI国际起名大师

AI 起名大师专起外国名,你只需告诉他你想要个哪国的名字,AI 起名大师分分钟给你想出一大堆名字出来!

下面都是是用 AI 起名大师生成的名字,有了它你还会为了起一个好的外国名而发愁吗

资源:
集智 AI 学园公众号回复“AI起名大师”,获取本节课的 Jupyter Notebook 文档!

准备数据

做深度学习的第一步是把数据准备好。像之前一样,我们先准备数据。

这次的数据是18个文本文件,每个文件以“国家名字”命名,其中存储了这个国家的不同人名。

在读取这些数据前,为了简化神经网络的输入参数规模,我们把各国各语言人名都转化成用26个英文字母来表示,下面就是转换的方法。

其中 all_letters 包含了我们数据集中所有可能出现的字符,也就是“字符表”。n_letters 是字符表的长度,在本例中长度为59。EOS 的索引号为58,它在字符表中没有对应的字符,仅代表结束。

读取数据

准备好处理数据的方法,下面就可以放心的读取数据了。

我们建立一个列表 all_categories 用于存储所有的国家名字。

建立一个字典 category_lines,以读取的国名作为字典的索引,国名下存储对应国别的名字。

现在我们的数据准备好了,可以搭建神经网络了!

搭建神经网络

这次使用的 RNN 神经网络整体结构上与之前相似,细节上增加了一部分内容。

在输入层增加了 category,即名字的国别。这个 category 是以独热编码向量(one-hot vector)的方式输入的,再啰嗦一遍就是,作为长度为18的向量,代表自己国别的位置为1, 其它位置都为0。

我们搭建的神经网络的目的是生成“名字”,而“名字”就是一序列的字符。所以神经网络的输出(output)代表的是字符表中的每个字符,能成为“下一个字符”的概率,概率最大的那个字符,即作为“下一个字符”。

另外,这次还加入了“第二层”神经网络,即 o2o 层,以增强神经网络的预测性能。在 o2o 中还包括一层“dropout”,它会将输入“softmax”之前的数据随机置0(在本例中为随机置0.1)。“dropout”常被用来缓解“过拟合(overfitting)”的问题,因为它可以增加“混乱(chaos)”并提高采样的多样性。

建立神经网络的代码比较简单,并且网络的各个部分都在上图中标识出来了。

准备训练

首先建立一个可以随机选择数据对 (category, line) 的方法,以方便训练时调用。

对于训练过程中的每一步,或者说对于训练数据中每个名字的每个字符来说,神经网络的输入是 (category, current letter, hidden state),输出是 (next letter, next hidden state)。所以在每 批次 的训练中,我们都需要“一个国别”、“对应国别的一批名字”、“以及要预测的下一个字符”。

与上节课一样,神经网络还是依据“当前的字符”预测“下一个字符”。比如对于“Kasparov”这个名字,创建的数据对是 ("K", "a"), ("a", "s"), ("s", "p"), ("p", "a"), ("a", "r"), ("r", "o"), ("o", "v"), ("v", "EOS")。

同样为了训练时方便使用,我们建立一个 random_training_set 函数,以随机选择出数据集 (category, line) 并转化成训练需要的 Tensor: (category, input, target)。

开始训练!

与之前处理得分类问题不同,在分类问题中只有最后的输出被使用。而在当前的 生成 名字的任务中,神经网络在每一步都会做预测,所以我们需要在每一步计算损失值。

PyTorch 非常易用,它允许我们只是简单的把每一步计算的损失加起来,并在最后进行反向传播。

我们定义 time_since 函数,它可以打印出训练持续的时间。

训练的过程与我们前几节课一样,就是调用训练函数,再等上几分钟就好啦吼吼!

通过 plot_every 控制打印日志的频率,通过 all_losses 控制记录绘图数据的频率,已经都是老套路啦!


绘制观察损失曲线

让我们将训练过程中记录的损失绘制成一条曲线,观察下神经网络学习的效果。

正如所有的优秀的神经网络一样^_^,损失值逐步降低并稳定在一个范围中。

测试使用神经网络

既然神经网络训练好了,那也就是说,我们喂给它第一个字符,他就能生成第二个字符,喂给它第二个字符,它就会生成第三个,这样一直持续下去,直至生成 EOS 才结束。

那下面我们编写 generate_one 函数以方便的使用神经网络生成我们想要的名字字符串,在这个函数里我们定义以下内容:




看起来还不错哈!不过这个模型还是有点简单,我们以后还可以对它进行改进,发明出更多的玩法!

更多玩法和改进

本文中给出的是通过指定“国家名”生成“人名”,我们还可以通过改变训练数据集,搞出其它的玩法,比如:

如果要考虑到改进:


如果您有任何关于Pytorch方面的问题,欢迎进【集智—清华】火炬群与大家交流探讨,添加集智小助手微信swarmaAI,备注(pytorch交流群),小助手会拉你入群。

关注集智AI学园公众号

获取更多更有趣的AI教程吧!

搜索微信公众号:swarmAI

集智AI学园QQ群:426390994

学园网站: campus.swarma.org

weixin.qq.com/r/FzpGXp3 (二维码自动识别)

哆哆女性网朋友别哭原唱北京网络建设网站奉贤建设企业网站网站seo的方法2020年郝姓女孩起名祁连山未解之谜秦姓起名座男生永城金润酒店梦见旅馆周公解梦苏州网站建设网建设6月29日是什么星座郭柯宇演过的电视剧金景芳周易讲座手机网站怎么制作软件高端网站建设 上海柘城惠济乡黑魂3攻略郑州seo优化外包好名字网名大全梦见自己吃面条周公解梦甘肃网站建设哪家好龙的未解之谜生物质颗粒公司起名起家园林公司名字大全低值易耗品和周转材料的区别丁姓起名字大全丁姓起名veronicavain宋词起少女名字简短正能量签名女孩起名五行属金的名字淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化