成都定制网站建推广员网站

当前位置: 首页 > news >正文

成都定制网站建,推广员网站,福鼎网页设计,WordPress强制更换主题NLP From Scratch: 生成名称与字符级RNN 这是我们关于“NLP From Scratch”的三个教程中的第二个。 在cite第一个教程 / intermediate / char_rnn_classification_tutorial /cite 中#xff0c;我们使用了 RNN 将名称分类为来源语言。 这次#xff…NLP From Scratch: 生成名称与字符级RNN 这是我们关于“NLP From Scratch”的三个教程中的第二个。 在cite第一个教程 / intermediate / char_rnn_classification_tutorial /cite 中我们使用了 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.org/ 有关安装说明使用 PyTorch 进行深度学习60 分钟的闪电战通常开始使用 PyTorch使用示例学习 PyTorch 进行广泛而深入的概述PyTorch(以前的 Torch 用户(如果您以前是 Lua Torch 用户 了解 RNN 及其工作方式也将很有用 循环神经网络的不合理效果显示了许多现实生活中的例子了解 LSTM 网络特别是关于 LSTM 的但总体上也关于 RNN 的 我还建议上一个教程从头开始进行 NLP使用字符级 RNN 对名称进行分类 准备数据 Note 从的下载数据并将其提取到当前目录。 有关此过程的更多详细信息请参见上一教程。 简而言之有一堆纯文本文件data/names/[Language].txt每行都有一个名称。 我们将行分割成一个数组将 Unicode 转换为 ASCII最后得到一个字典{language: [names …]}。 from future import unicode_literals, print_function, division 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© ! Mnand c in all_letters)# Read a file and split into lines def readLines(filename):lines open(filename, encodingutf-8).read().strip().split(\n)return [unicodeToAscii(line) for line in lines]# Build the category_lines dictionary, a list of lines per category 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 from https://download.pytorch.org/tutorial/data.zip and extract it to the current directory.)print(# categories:, n_categories, all_categories) print(unicodeToAscii(ONéàl)) 出

categories: 18 [French, Czech, Dutch, Polish, Scottish, Chinese, English, Italian, Portuguese, Japanese, German, Russian, Korean, Arabic, Greek, Vietnamese, Spanish, Irish]

ONeal 建立网络 该网络使用最后一个教程的 RNN 扩展了并为类别张量附加了一个参数该参数与其他张量串联在一起。 类别张量是一个热向量就像字母输入一样。 我们将输出解释为下一个字母的概率。 采样时最有可能的输出字母用作下一个输入字母。 我添加了第二个线性层o2o(将隐藏和输出结合在一起之后以使它具有更多的肌肉可以使用。 还有一个辍学层以给定的概率(此处为 0.1将输入的部分随机归零通常用于模糊输入以防止过拟合。 在这里我们在网络的末端使用它来故意添加一些混乱并增加采样种类。 import torch import torch.nn as nnclass RNN(nn.Module):def init(self, input_size, hidden_size, output_size):super(RNN, self).init()self.hidden_size hidden_sizeself.i2h nn.Linear(n_categories input_size hidden_size, hidden_size)self.i2o nn.Linear(n_categories input_size hidden_size, output_size)self.o2o nn.Linear(hidden_size output_size, output_size)self.dropout nn.Dropout(0.1)self.softmax nn.LogSoftmax(dim1)def forward(self, category, input, hidden):input_combined torch.cat((category, input, hidden), 1)hidden self.i2h(input_combined)output self.i2o(input_combined)output_combined torch.cat((hidden, output), 1)output self.o2o(output_combined)output self.dropout(output)output self.softmax(output)return output, hiddendef initHidden(self):return torch.zeros(1, self.hidden_size) 训练 准备训练 首先helper 函数获取随机对(类别行 import random# Random item from a list def randomChoice(l):return l[random.randint(0, len(l) - 1)]# Get a random category and random line from that category def randomTrainingPair():category randomChoice(all_categories)line randomChoice(category_lines[category])return category, line 对于每个时间步(即对于训练词中的每个字母网络的输入将为(category, current letter, hidden state)而输出将为(next letter, next hidden state)。 因此对于每个训练集我们都需要类别一组输入字母和一组输出/目标字母。 由于我们正在预测每个时间步中当前字母的下一个字母因此字母对是该行中连续字母的组-例如 对于ABCDlt;EOSgt;我们将创建(“ A”“ B”(“ B”“ C”(“ C”“ D”(“ D”“ EOS”。 类别张量是大小为lt;1 x n_categoriesgt;的一热张量。 训练时我们会随时随地将其馈送到网络中-这是一种设计选择它可能已被包含为初始隐藏状态或某些其他策略的一部分。

One-hot vector for category

def categoryTensor(category):li all_categories.index(category)tensor torch.zeros(1, n_categories)tensor[0][li] 1return tensor# One-hot matrix of first to last letters (not including EOS) for input def inputTensor(line):tensor torch.zeros(len(line), 1, n_letters)for li in range(len(line)):letter line[li]tensor[li][0][all_letters.find(letter)] 1return tensor# LongTensor of second letter to end (EOS) for target def targetTensor(line):letter_indexes [all_letters.find(line[li]) for li in range(1, len(line))]letter_indexes.append(n_letters - 1) # EOSreturn torch.LongTensor(letter_indexes) 为了方便训练我们将使用randomTrainingExample函数来提取随机(类别行对并将其转换为所需的(类别输入目标张量。

Make category, input, and target tensors from a random category, line pair

def randomTrainingExample():category, line randomTrainingPair()category_tensor categoryTensor(category)input_line_tensor inputTensor(line)target_line_tensor targetTensor(line)return category_tensor, input_line_tensor, target_line_tensor 训练网络 与仅使用最后一个输出的分类相反我们在每个步骤进行预测因此在每个步骤都计算损失。 autograd 的神奇之处在于您可以简单地将每一步的损失相加然后在末尾调用。 criterion nn.NLLLoss()learning_rate 0.0005def train(category_tensor, input_line_tensor, target_line_tensor):target_linetensor.unsqueeze(-1)hidden rnn.initHidden()rnn.zero_grad()loss 0for i in range(input_line_tensor.size(0)):output, hidden rnn(category_tensor, input_line_tensor[i], hidden)l criterion(output, target_linetensor[i])loss lloss.backward()for p in rnn.parameters():p.data.add(-learning_rate, p.grad.data)return output, loss.item() / input_line_tensor.size(0) 为了跟踪训练需要多长时间我添加了一个timeSince(timestamp)函数该函数返回人类可读的字符串 import time import mathdef timeSince(since):now time.time()s now - sincem math.floor(s / 60)s - m * 60return %dm %ds % (m, s) 训练照常进行-召集训练多次等待几分钟每print_every个示例打印当前时间和损失并在all_losses中将每个plot_every实例的平均损失存储下来以便以后进行绘图。 rnn RNN(n_letters, 128, n_letters)n_iters 100000 print_every 5000 plot_every 500 all_losses [] total_loss 0 # Reset every plot_every itersstart time.time()for iter in range(1, n_iters 1):output, loss train(*randomTrainingExample())total_loss lossif iter % print_every 0:print(%s (%d %d%%) %.4f % (timeSince(start), iter, iter / n_iters * 100, loss))if iter % plot_every 0:all_losses.append(total_loss / plot_every)total_loss 0 Out: 0m 21s (5000 5%) 2.7607 0m 41s (10000 10%) 2.8047 1m 0s (15000 15%) 3.8541 1m 19s (20000 20%) 2.1222 1m 39s (25000 25%) 3.7181 1m 58s (30000 30%) 2.6274 2m 17s (35000 35%) 2.4538 2m 37s (40000 40%) 1.3385 2m 56s (45000 45%) 2.1603 3m 15s (50000 50%) 2.2497 3m 35s (55000 55%) 2.7588 3m 54s (60000 60%) 2.3754 4m 13s (65000 65%) 2.2863 4m 33s (70000 70%) 2.3610 4m 52s (75000 75%) 3.1793 5m 11s (80000 80%) 2.3203 5m 31s (85000 85%) 2.5548 5m 50s (90000 90%) 2.7351 6m 9s (95000 95%) 2.7740 6m 29s (100000 100%) 2.9683 绘制损失 绘制 all_losses 的历史损失可显示网络学习情况 import matplotlib.pyplot as plt import matplotlib.ticker as tickerplt.figure() plt.plot(all_losses) 网络采样 为了示例我们给网络一个字母询问下一个字母是什么将其作为下一个字母输入并重复直到 EOS 令牌。 为输入类别起始字母和空隐藏状态创建张量用起始字母创建一个字符串output_name直到最大输出长度 将当前信件输入网络从最高输出中获取下一个字母以及下一个隐藏状态如果字母是 EOS请在此处停止如果是普通字母请添加到output_name并继续 返回姓氏 Note 不必给它起一个开始字母另一种策略是在训练中包括一个“字符串开始”令牌并让网络选择自己的开始字母。 max_length 20# Sample from a category and starting letter def sample(category, start_letterA):with torch.no_grad(): # no need to track history in samplingcategory_tensor categoryTensor(category)input inputTensor(start_letter)hidden rnn.initHidden()output_name start_letterfor i in range(max_length):output, hidden rnn(category_tensor, input[0], hidden)topv, topi output.topk(1)topi topi[0][0]if topi n_letters - 1:breakelse:letter all_letters[topi]output_name letterinput inputTensor(letter)return output_name# Get multiple samples from one category and multiple starting letters def samples(category, start_lettersABC):for start_letter in start_letters:print(sample(category, start_letter))samples(Russian, RUS)samples(German, GER)samples(Spanish, SPA)samples(Chinese, CHI) Out: Rovakovak Uariki Sakilok Gare Eren Rour Salla Pare Alla Cha Honggg Iun