写点什么

PyTorch 深度学习实战 | 基于 RNN 的文本分类

作者:TiAmo
  • 2023-03-16
    江苏
  • 本文字数:1109 字

    阅读完需:约 4 分钟

PyTorch深度学习实战 | 基于RNN的文本分类

PyTorch 是当前主流深度学习框架之一,其设计追求最少的封装、最直观的设计,其简洁优美的特性使得 PyTorch 代码更易理解,对新手非常友好。

本文为实战篇,介绍基于 RNN 的文本分类!

本文将构建和训练基本的字符级 RNN(递归神经网络)来对单词进行分类。展示如何“从头开始”进行 NLP(自然语言处理)建模的预处理数据,尤其是不使用众多 NLP 工具库提供的许多便利功能,因此读者可以从系统层面角度了解 NLP 建模的预处理工作。

字符级 RNN 将单词作为一系列字符读取,之后在每个步骤输出一个预测结果和“Hidden State”,将其先前的 Hidden State 输入每个下一步。这里将最终的预测作为输出,即单词属于哪个类别。

具体来说,这里将训练来自 18 种起源于不同语言的数千种姓氏,并根据拼写方式预测名称的来源,样例如下。


1、数据准备


数据下载超链接:https://download.pytorch.org/tutorial/data.zip

解压缩上述数据得到 18 个 txt 文件,将它们放置在 data/names 目录下。下面提供一段代码做预处理。


上述代码输出如下。


2、将名字转换为张量

现在已经整理好了所有数据集中的名字,这里需要将它们转换为张量以使用它们。为了表示单个字母,这里使用大小为<1×n_letters>的“one-hot”向量。一个 one-hot 向量用 0 填充,但当前字母的索引处的数字为 1,例如 “ b”=<0 1 0 0 0 …>。为了用这些向量组成一个单词,这里将其中的一些连接成 2 维矩阵<line_length × 1 × n_letters>。

可以观察到数据的维度是<line_length×1×n_letters>,而不是<line_length×n_letters>,是因为额外的 1 维是因为 PyTorch 假设所有内容都是批量的——在这里只使用 1 的 batchsize。

代码如下。


输出如下。


3、构建神经网络

在 PyTorch 中构建递归神经网络(RNN)涉及在多个时间步长上克隆多个 RNN 层的参数。RNN 层保留了 Hidden State 和梯度,这些状态完全由 PyTorch 的计算图来自动完成维护。这意味着读者可以以非常“纯粹”的方式实现 RNN,即只关心前馈网络(Feed-forward Network)而不需要关注反向传播(Back Propagation)。

下面样例中的 RNN 模块只有两个线性层,它接受一个输入和一个 Hidden State,之后网络输出结果需要经过一个 LogSoftmax 层。RNN 模型如图 1 所示。


■ 图 1 RNN 模型


RNN 代码定义如下。



要运行此网络,需要传递输入(在本例中为当前字母的 Tensor)和先前的 Hidden State(首先将其初始化为零)。这里将返回输出(每种语言的概率)和下一个 Hidden State(将其保留用于下一步)。


为了提高效率,这里不想为每个步骤都创建一个新的 Tensor,因此将使用 lineToTensor 代替 letterToTensor 并使用切片。这可以通过预先计算一批(Batch)张量来进一步优化。


可以看到,输出为<1×n_categories>张量,其中每个项目都是该类别的可能性(更高的可能性更大)。



发布于: 刚刚阅读数: 3
用户头像

TiAmo

关注

有能力爱自己,有余力爱别人! 2022-06-16 加入

CSDN全栈领域优质创作者,万粉博主;阿里云专家博主、星级博主、技术博主、阿里云问答官,阿里云MVP;华为云享专家;华为Iot专家;亚马逊人工智能自动驾驶(大众组)吉尼斯世界纪录获得者

评论

发布
暂无评论
PyTorch深度学习实战 | 基于RNN的文本分类_CNN_TiAmo_InfoQ写作社区