来源 | Natural Language Processing with PyTorch
作者 | Rao,McMahan
译者 | Liangchu
校对 | gongyouliu
编辑 | auroral-L
全文共4790字,预计阅读时间30分钟。
上下拉动翻看这个书签
4.1 多层感知机
4.1.1 一个简单示例:XOR
4.1.2 在 PyTorch 中实现多层感知机
4.2 示例:使用多层感知机对姓氏进行分类
4.2.1 姓氏数据集
4.2.2 Vocabulary,Vectorizer和DataLoader
4.2.2.1 Vocabulary类
4.2.2.2 SurnameVectorizer
4.2.3 SurnameClassifier模型
4.2.4 训练例程
4.2.4.1 训练循环(training loop)
4.2.5 模型评估和预测
4.2.5.1 在测试集上评估
4.2.5.2 分类一个新姓氏
4.2.5.3 获取新姓氏的前k个预测
4.2.6 MLPs正则化:权重正则化和结构正则化(或Dropout)
4.3 卷积神经网络
4.3.1 CNN 超参数
4.3.1.1 卷积操作的维度
4.3.1.2 通道
4.3.1.3 核大小
4.3.1.4 Stride
4.3.1.5 Padding
4.3.1.6 Dilation
4.3.2 在 PyTorch 实现 CNNs
4.4 示例:使用 CNN 对姓氏进行分类
4.4.1 SurnameDataset类
4.4.2 Vocabulary,Vectorizer和DataLoader
4.4.3 使用 CNN 重新实现SurnameClassifier
4.4.4 训练例程
4.4.5 模型评估和预测
4.4.5.1 在测试集上评估
4.4.5.2 为新的姓氏分类或获取最佳预测
4.5 CNN 中的其他话题
4.5.1 池化操作
4.5.2 批量规范化(BatchNorm)
4.5.3 网络中的网络连接(1x1卷积)
4.5.4 残差连接/残差块
4.6 总结
4.4 示例:使用 CNN 对姓氏进行分类
为了证明 CNN 的有效性,让我们使用一个简单的CNN模型来分类姓氏。这项任务的许多细节与前面多层感知机的示例相同,但是模型的构造和向量化过程发生了变化。模型的输入将是一个独热矩阵,而非我们在上一个例子中看到的压缩的独热向量。这种设计使得 CNN 更好地“查看”字符的排列,并对在“示例:使用多层感知机对姓氏进行分类”一节中使用的压缩的独热编码中丢失的序列信息进行编码。
4.4.1 SurnameDataset类
我们已经在“姓氏数据集”一节中介绍过姓氏数据集。本例中,我们会使用相同的数据集,然而在实现上有一个不同之处:数据集由独热向量矩阵而非一个压缩的独热向量组成。为了实现这一点,我们实现了一个数据集类,它跟踪最长的姓氏,并将其作为矩阵中包含的行数提供给向量化器。列的数量是独热向量的大小(Vocabulary的大小)。下例(4-17)展示对SurnameDataset.__getitem__()所做的更改,我们会在下一小节显示对SurnameVectorizer.vectorize()的更改。
示例 4-17:为传递最大姓氏长度而修改的SurnameDataset
class SurnameDataset(Dataset):
# ... existing implementation from Section 4.2
def __getitem__(self, index):
row = self._target_df.iloc[index]
surname_matrix = \
self._vectorizer.vectorize(row.surname, self._max_seq_length)
nationality_index = \
self._vectorizer.nationality_vocab.lookup_token(row.nationality)
return {'x_surname': surname_matrix,
'y_nationality': nationality_index}
我们使用数据集中最长的姓氏来控制独热矩阵的大小,有两个原因:首先,将每个minibatch的姓氏矩阵组合成一个三维张量,要求它们的大小相同;其次,使用数据集中最长的姓氏意味着可以以相同的方式处理每个minibatch。
4.4.2 Vocabulary,Vectorizer和DataLoader
在本例中,尽管Vocabulary和DataLoader的实现方式与前面“ Vocabulary,Vectorizer和DataLoader”一节中的示例相同&