定义函数findFile(path)
用来寻找文件,此函数返回一个文件路径列表。输出如:['file1.txt', 'file2.txt', ...]
。
all_letters
是字符串变量,包含了所有的字母、空格和一些常见的标点符号。
n_letters
代表字符串变量all_letters
的长度。
定义函数unicodeToAscii(s)
用来将unicode字符串转换为ASCII字符串。比如说,将 Unicode 字符串 “Café” 转换为 ASCII 字符串 “Cafe”。此函数返回转换后的字符串。
建立一个名为category_lines
的字典,该字典的键为语言名称,值为一个列表,包含语言的所有名字。
all_categories
是一个列表。
定义函数readLines(filename)
用来读取一个文件并将其分割成行列表。此函数返回一个经过unicodeToAscii
函数转换后的新列表。
将数据读取到内存中。其中category
为文件名,all_categories
为全部文件名包含在一起的列表,category_lines
的键为category
,值为对应的文件内容。n_categories
是文件的数量。
把所有名称转换为张量,用one-hot vector来表示单个字母,向量大小为<1 x n_letters>
。
一个单词的张量为<line_length x 1 x n_letters>
。
定义函数letterToIndex(letter)
,用于寻找字母在all_letters中的下标,再定义函数letterToTensor(letter)
将一个字母转换成<1 x n_letters>的张量,该函数返回该张量。函数lineToTensor(line)
将一个单词转换成一个大小为<line_length x 1 x n_letters>
的张量,该函数返回该张量。
定义一个名为RNN的神经网络模型,其中 __init__(self, input_size, hidden_size, output_size)
函数用于初始化input_size,hidden_size,output_size,即输入维度大小,隐藏层维度大小和输出维度大小。同时还定义了模型的两个层,一个LSTM层,一个线性层(用于将LSTM层输出的隐藏状态转换到输出的维度output_size)。
模型中forward(self, input, hidden, context):
函数有三个参数,input为输入数据张量,hidden为LSTM的隐藏状态张量,context为LSTM的单元状态张量。该函数返回output,hidden以及context。
该模型还有一个函数initHidden
,用于初始化隐藏状态和单元状态,该函数返回形状为<1 x 1 x hidden_size>
的全零张量座位初始的隐藏状态和单元状态。
接下来,通过指定隐藏层的维度 n_hidden
、输入维度 n_letters
和输出维度 n_categories
来创建一个 RNN 模型对象 rnn。
使用函数initHidden
来初始化hidden和context,令input为一个lineToTensor
函数返回的<line_length x 1 x n_letters>
张量。
output的张量大小为<1 x 1 x n_categories>
传递一个输入和上一个隐藏状态(初始化为0)后会得到输出(每种语言的概率)和下一个隐藏状态(下一步中使用)。
定义categoryFromOutput(output)
函数,用于将神经网络模型的输出张量转换为对应的类别标签。该函数返回最大值对应的索引值category_i
和对应的类别标签all_categories[category_i]
。
初始化input,hidden,context,并用rnn(input, hidden, context)更新output,hidden,context。
定义一个函数randomChoice(l)
,用来随机选择一个整数,整数不大于len(l) - 1。再定义一个函数randomTrainingExample
,该函数中使用randomChoice
函数随机选择一种语言category,再从该语言文件中选择任意一行,将该语言文件和该行都变成张量。该函数返回category,line,以及对应的张量category_tensor和line_tensor。
接下来训练网络,定义损失函数criterion。定义训练函数train(category_tensor, line_tensor)
,该函数返回输出张量和损失值。
定义timeSince(since)
函数用来记录代码中某个操作所花费的时间。
定义评估函数evaluate(line_tensor)
用来对输入进行模型预测,并根据预测结果计算混淆矩阵,用于评估模型在给定样例上的性能。
定义预测函数predict(input_line, n_predictions = N)
对给定的输入进行模型预测,并返回预测结果的前 N 个类别及其对应的概率值。