深度学习案例教程 教案6.6实践任务新闻主题分类.docx
06实践任务新闻主题分类
1
我们本节来学习实践任务新闻主题分类。
新闻主题的分类主要是以一段新闻报道中的文体描述内容为输入,使用模型帮助我们判断它最有可能属于哪一种类型的新闻。
这是典型的一个文本分类问题。
我们在这里假定每种类型是互斥的。也就是说文本描述啊,有且只有一种类型。
2
这里我们会用到一个数据集,叫AG_NEWS。
它是一个包含了100多万篇文章的集合。在这个学术社区,做这个数据集主要是为了数据挖掘,信息检索,数据压缩等方面的学术研究。
AG_NEWS这个数据集它有四个标签,分别是World、Sports、Business和Sci/Tec。
Torchtext库,它里面提供了一些原始数据迭代器,这些迭代器呢,可以查看原始的字符串数据,比如AG_NEWS数据集迭代器可以生成包含文本和标签的元组。
3
我们来看一下具体的代码实现以及相应的结果。
可以看到我们调用AG_NEWS数据集迭代器后输出了一个元组,元组中第一个元素是标签,标签3表示文本的类别为Business。第二个是文本内容。
4
了解了AG_NEWS数据集迭代器的使用及输出后,我们来对实践任务的数据进行处理。
我们直接来看具体的代码。
5
在这里首先我们做了一个基本的英文分词器,
6
然后使用AG_NEWS这个数据集创建一个训练数据迭代器。
7
接下来,定义了一个分词生成器。
8
然后在这里进行构建vocab的这个词汇表,
构建完词汇表之后,设置vocab的索引。当某个单词不在词汇中,它就会返回一个零。
9
这里我们最终这个例子所输出的结果是一个数组,数组中都是整数,也就是说词典把这些字符串转换为了整数列表。
把here,is,an,example转成了475,21,30,5297这样的一个整数列表,这就是一个用序列化工具来将我们的字符串列表转为整数的一个操作。
这就是数据处理。
10
接下来我们来看实践任务二,模型搭建。
文本分类模型是由PyTorch库中的nn.EmbeddingBag层和一个用于分类的线性连接层组成。
nn.EmbeddingBag在默认状态下计算所有词向量的平均值。虽然,文本文章由不同的长度,但是它通过这个模型不需要填充,因为文本的长度保存在偏移量中了。
11
好,接下来我们主要看一下这个对于模型搭建的代码实现。
12
那首先在这里构建了一个文本分类模型TextClassificationModel,
然后初始化我们的这个文本方法。
这里传进来了几个参数,self是默认参数,vocab_size是整个语料包中不同的词汇总数,还有embed_dim是定词嵌入的一个维度参数,那么num_class呢,是文本分类的一个类别总数。
然后,super继承我们的这个文本分类模型以及它的初始化方法。
self.embedding实例化我们的embedding层,要传进去词汇总数、维度。这个sparse参数为true,这是表示对每层求解梯度时,只更新这个部分权重。
然后self.fc实例化线性层啊,这两个参数呢,分别是我们输入神经元个数和输出神经元个数。
然后self.init_weights为各层初始化权重
13
我们来看看这个初始化权重的方法。
首先,我们指定初始权重的取值范围数为0.5。
然后把我们各层的这个权重参数进行初始化均匀分布。
我们的权重偏置都初始化为零。
14
然后下一步呢,我们定义一个forward的方法来获取这个embedding里面的结果,然后把这个结果传到我们的fc方法中进行返回。
15
下一步呢,定义模型训练函数,首先用模块调用模型训练函数,在这里初始化训练损失和准确率的值都为零。
定义日志间隔时间为500。
然后把我们的这个初始时间取出来。
16
接下来进行循环,循环什么呢?
对我们的数据集进行循环遍历来更新参数。
17
那第一步就是设置优化器的初始梯度为零,
18
调用模型来获取预测标签。
根据预测标签和真实标签进行损失计算。
19
然后进行反向传播,反向传播之后呢,进行梯度裁剪,再进行超参数的更新。
20
然后将每个批次的损失进行累加来得到总损失。
21
最终,我们做一个打印输出,查看这一轮的结果。
22
将结果输出之后,初始化训练损失和准确率为零。
记录训练的开始时间进行下一轮循环。
23
接下来我们开启了评估模式
24
首先初始化验证损失值和准确率为零。
25
然后开启验证阶段,不再求解梯度,做一个for循环,按批次取出我们的数据验证。
验证的过程与前面训练过程类似,此处就不再赘述了。
这是我们完整的模型搭建。
26
那下一步呢,我们来看实践任务三,模型训练。
因为原始的AG_NEWS没有测试数据集,我们将数据集拆分为训练集和测试集,其中训练集占比为95%,测试集