pytorch学习(七)——文本分类实例

本文介绍使用PyTorch进行文本分类的过程,包括整体思路、工具设置、超参数配置、数据处理等内容。通过构建双向LSTM模型实现文本分类任务。

1. 整体思路

在这篇文章里,我们要试着用pytorch对文本进行分类,我来叙述下这个实例的基本思路。文本分类不像图像分类,图像读入计算机就是一个个的像素点,就已经是数值类型了,但是文本不同,文本是一个个的文字组成起来的,但是神经网络中能够接受训练的是一个个的数字,那么就要想办法将文字转为数值,一个可行的办法是使用 One-hot 编码,但是One-hot编码的冗余程度太高了,这里我们使用更加有效的方法,词向量的方法,即将文本转为一个个的向量,用多维向量进行表示。本例中下载了搜狗以及腾讯预训练的词向量模型,可以选择一个进行使用。

首先,我们确定文本分类中使用的模型,这里我们使用RNN模型中的双向LSTM构建模型。然后,对数据进行预处理,将数据分为文本以及标签两个部分,由于模型是预先搭建好的,所以这里要确定每句话最多处理多少个字数,即 s e q _ s i z e seq\_{size} seq_size ,多于 s e q _ s i z e seq\_{size} seq_size 则将其截断,少于 s e q _ s i z e seq\_{size} seq_size 则进行填充。最后,确定好损失函数和优化器,对模型的参数进行训练即可。

2. 工具设置

这里我们使用搜狗的词向量模型,并设置随机数种子,设置随机数种子能够帮助我们在每一次运行代码时都得到相似的结果,方便对代码进行复现。相关设置如下代码所示

import torch
import numpy as np

# 存放数据的文件夹
dataset = 'text_classify_data'

# 搜狗新闻:embedding_SougouNews.npz, 腾讯:embedding_Tencent.npz
embedding = 'embedding_SougouNews.npz'

# 设置随机数种子,保证每次运行结果一致,不至于不能复现模型
np.random.seed(1)
torch.manual_seed(1)
torch.cuda.manual_seed_all(1)
torch.backends.cudnn.deterministic = True  # 保证每次结果一样

3. 超参数设置

本例中采用另外一种设置超参数的方法,将所有的超参数都写在一个类中,这样需要传递超参数时只需要传递该类的对象即可,十分方便。而且如果需要对超参数进行修改,可以只在该类中进行修改,避免了修改超参数全篇找名称的麻烦,该例用到的超参数及设置如下所示:

import numpy as np

class Config(object):

    """配置参数"""
    def __init__(self, dataset, embedding):
        '''
        :param dataset: 数据所在的文件夹路径
        :param embedding: 使用的词嵌入文件名称
        '''
        self.model_name = 'TextRNN'
        self.train_path = dataset + '/data/train.txt'                                # 训练集
        self.dev_path = dataset + '/data/dev.txt'                                    # 验证集
        self.test_path = dataset + '/data/test.txt'                                  # 测试集
        self.class_list = [x.strip() for x in open(
            dataset + '/data/class.txt').readlines()]                                # 类别列表
        self.vocab_path = dataset + '/data/vocab.pkl'                                # 词表
        self.save_path = dataset + '/saved_dict/' + self.model_name + '.ckpt'        # 模型训练结果
        self.embedding_pretrained = torch.tensor(
            np.load(dataset + '/data/' + embedding)["embeddings"].astype('float32')) # 预训练词向量
        self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')   # 设备

        self.dropout = 0.5                                              # 随机失活
        self.require_improvement = 1000                                 # 若超过1000batch效果还没提升,则提前结束训练
        self.num_classes = len(self.class_list)                         # 类别数
        self.num_epochs = 10                                            # epoch数
        self.batch_size = 128                                           # mini-batch大小
        self.pad_size = 32                                              # 每句话处理成的长度(短填长切)
        self.learning_rate = 1e-3                                       # 学习率
        self.embed = self.embedding_pretrained.size(1)                  # 词向量维度, 若使用了预训练词向量,则维度统一
        self.hidden_size = 128                                          # lstm隐藏层
        self.num_layers = 2                                             # lstm层数


# 超参数的设置
config = Config(dataset, embedding
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值