吾本轻狂|PyTorch文本:02.使用字符级RNN生成名字

在上一个教程中 ,中我们使用RNN网络对名字所属的语言进行分类 。 这一次我们会反过来根据语言生成名字 。
> python sample.py Russian RUSRovakovUantovShavakov> python sample.py German GERGerrenErengRosher> python sample.py Spanish SPASallaParerAllan> python sample.py Chinese CHIChanHangIun我们仍使用只有几层线性层的小型RNN 。 最大的区别在于 , 这里不是在读取一个名字的所有字母后预测类别 , 而是输入一个类别之后在每一时刻 输出一个字母 。 循环预测字符以形成语言通常也被称为“语言模型” 。 (也可以将字符换成单词或更高级的结构进行这一过程)
阅读建议
开始本教程前 , 你已经安装好了PyTorch , 并熟悉Python语言 , 理解“张量”的概念:
PyTorch 安装指南
Deep Learning with PyTorch:A 60 Minute Blitz :PyTorch的基本入门教程
Learning PyTorch with Examples:得到深层而广泛的概述
PyTorch for Former Torch Users Lua Torch:如果你曾是一个Lua张量的使用者
事先学习并了解RNN的工作原理对理解这个例子十分有帮助:
The Unreasonable Effectiveness of Recurrent Neural Networks展示了很多实际的例子
Understanding LSTM Networks是关于LSTM的 , 但也提供有关RNN的说明
1.准备数据点击这里下载数据并将其解压到当前文件夹 。
有关此过程的更多详细信息 , 请参阅上一个教程 。 简而言之 , 有一些纯文本文件data/names/[Language].txt , 它们的每行都有一个名字 。我们按行将文本按行分割得到一个数组 , 将Unicode编码转化为ASCII编码 , 最终得到{language: [names ...]}格式存储的字典变量 。
from __future__ import unicode_literals, print_function, divisionfrom io import openimport globimport osimport unicodedataimport stringall_letters = string.ascii_letters + " .,;'-"n_letters = len(all_letters) + 1 # Plus EOS markerdef findFiles(path): return glob.glob(path)# 将Unicode字符串转换为纯ASCII, 感谢def unicodeToAscii(s):return ''.join(c for c in unicodedata.normalize('NFD', s)if unicodedata.category(c) != 'Mn'and c in all_letters)# 读取文件并分成几行def readLines(filename):lines = open(filename, encoding='utf-8').read().strip().split('\n')return [unicodeToAscii(line) for line in lines]# 构建category_lines字典 , 列表中的每行是一个类别category_lines = {}all_categories = []for filename in findFiles('data/names/*.txt'):category = os.path.splitext(os.path.basename(filename))[0]all_categories.append(category)lines = readLines(filename)category_lines[category] = linesn_categories = len(all_categories)if n_categories == 0:raise RuntimeError('Data not found. Make sure that you downloaded data ''fromand extract it to ''the current directory.')print('# categories:', n_categories, all_categories)print(unicodeToAscii("O'Néàl"))输出结果
# categories: 18 ['French', 'Czech', 'Dutch', 'Polish', 'Scottish', 'Chinese', 'English', 'Italian', 'Portuguese', 'Japanese', 'German', 'Russian', 'Korean', 'Arabic', 'Greek', 'Vietnamese', 'Spanish', 'Irish']O'Neal2.构造神经网络这个神经网络比上一个RNN教程 中的网络增加了额外的类别张量参数 , 该参数与其他输入连接在一起 。 类别可以像字母一样组成 one-hot 向量构成张量输入 。
我们将输出作为下一个字母是什么的可能性 。 采样过程中 , 当前输出可能性最高的字母作为下一时刻输入字母 。


推荐阅读