您的位置 首页 PyTorch 教程

PyTorch 实现循环神经网络判断人名属于哪个国家的常用名

PyTorch入门实战教程

在本文中,我们将构建并训练一个字符级别的循环神经网络来对单词进行分类。在基于字符级别的循环神经网络里,单词将是一个个字符(字母)的序列,利用循环神经网络具备一定的时序记忆功能来实现判断一个单词的类别。具体在本文的示例中,我们将对来自18种语言的上千个人名进行训练,并让网络根据给定名字的字母拼写来预测这个名字最可能是哪个国家常用的名字。

推荐先期阅读

在阅读本文前,读者最好具备Python,Pytorch的基本知识,并能理解“张量”这个概念。同时有一定的循环神经网络和LSTM知识对于理解本文也是很有帮助的。

本文从“准备数据”、“创建网络模型”、“训练网络”、“评估网络”、“自我练习”等五各方面来展开,其中最后一部分“自我练习”是留给读者自己实践的内容。

准备数据

此处下载数据并把它解压到当前目录。下载的压缩文件中data/names目录下包含18个以语言名命名的txt文件,每一个文件里包含大量的人名字符串,每一行表示一个人名。大多数是常用字符,不过我们仍然需要把这些人名字符串从unicode字符转化为ASCII字符。

我们要把所有这些数据加载到一个字典中,字典的键是语言类别字符串,对应的值是一个包含了该语言人名的列表,类似于{language:[names …]}。同时我们也维护一个类别列表,保存了所有语言类别,类似于[language …]。下面的代码做了一些准备工作:

执行上面的代码会输出:

category_lines字典和all_categories列表保存了我们要训练的数据,后文要用到。用下面的代码简要了解下字典保存的数据样式:

输出:

将人名转化为张量

为了能对人名进行分析,我们需要把以字符串表示的人名转化为以张量形式表示的人名。由于本文介绍的是基于字符级别的循环网络,我们将使用独热向量(one-hot vector)技术来表示人人名中出现的单个字符,而用一个2D的矩阵来表示一个人名字符串。单个字符的独热向量的尺寸是<1 × n_letters>。其中该向量里大部分维度的值均为0,只有对应该字符在所有字符列表(all_letters)中的索引位置的值为1。例如字符”b”=<0 1 0 0 0 …>。

把组成人名的字符串的每一个字符的向量连起来,就是表示人名的2维矩阵。中间多出来的长度为1的维度是因为PyTorch默认所有的张量都是基于块(batch)的,这里我们不使用块,因此将其设为1。

我们使用下面的代码来完成上述工作,并用字符”J”和人名字符串”Jones”来看看效果: