小白的进阶之路系列之十七----人工智能从初步到精通pytorch综合运用的讲解第十部分
NLP 从零开始:使用字符级 RNN 生成姓名
这是我们“NLP 从零开始”系列三部分教程中的第二部分。在第一个教程中,我们使用了 RNN 将姓名分类到其语言来源。这次我们将反过来,从语言生成姓名。
> python sample.py Russian RUS
Rovakov
Uantov
Shavakov> python sample.py German GER
Gerren
Ereng
Rosher> python sample.py Spanish SPA
Salla
Parer
Allan> python sample.py Chinese CHI
Chan
Hang
Iun
我们仍然手工构建了一个带有几个线性层的小型 RNN。主要区别在于,我们不再是在读取所有字母后预测类别,而是输入一个类别并一次输出一个字母。循环预测字符以形成语言(这也可以使用单词或其他更高阶的结构来完成)通常被称为“语言模型”。
推荐阅读
我假设您至少已安装 PyTorch,了解 Python,并理解张量 (Tensors)
- https://pytorch.ac.cn/ 安装说明
- 使用 PyTorch 进行深度学习:60 分钟速成 了解 PyTorch 的基本用法
- 通过示例学习 PyTorch 获取广泛而深入的概览
- PyTorch for Former Torch Users 如果您是 Lua Torch 用户
了解 RNN 及其工作原理也会有所帮助
- 循环神经网络的惊人有效性 展示了许多实际示例
- 理解 LSTM 网络 专门介绍了 LSTM,但对于理解 RNN 总体上也有帮助
我还建议阅读前一个教程:NLP 从零开始:使用字符级 RNN 对姓名进行分类
准备数据
注意
从这里下载数据并将其解压到当前目录。
有关此过程的更多详细信息,请参见上一个教程。简而言之,有许多纯文本文件 data/names/[Language].txt
,每行一个姓名。我们将行拆分成数组,将 Unicode 转换为 ASCII,最终得到一个字典 {语言: [姓名 ...]}
。
from io import open
import glob
import os
import unicodedata
import stringall_letters = string.ascii_letters + " .,;'-"
n_letters = len(all_letters) + 1 # Plus EOS markerdef findFiles(path): return glob.glob(path)# Turn a Unicode string to plain ASCII, thanks to https://stackoverflow.com/a/518232/2809427
def unicodeToAscii(s):return ''.join(c for c in unicodedata.normalize('NFD', s)if unicodedata.category(c) != 'Mn'and c in all_letters)# Read a fil