【情感分析 PyTorch】RNN于IMDB数据集上的表示

本文介绍了使用RNN进行情感分析,特别是在IMDB数据集上的应用。通过GloVe预训练词向量,RNN模型能够处理句子的序列信息。文章讨论了数据处理、模型构建以及训练中遇到的问题,强调兴趣驱动和模型对句子结构的敏感性。
摘要由CSDN通过智能技术生成

文章目录

RNN是啥

Recurrent Neural Network(RNN),循环神经网络的优势在于能够处理任意长度的输入(或者说流式(strem)输入,插一嘴,博主非常讨厌这种故作玄虚的称呼,似乎显得提出者高大上,实际只能让后来者在单独学习的时候费尽力气)。简单的来说,一句话**“go to bed instead of go mad”**,可以通过分词将这句话分为:['go', 'to', 'bed', 'instead', 'of', 'go', 'mad']。在这之后,我们可以用一些pretrained的向量对这些单词有一个表示,比如我们可以用GloVe拿到了一个向量的list,里面的向量都是对应位置单词的表示。
在给RNN模型喂的时候,每一个向量都依此送进去跑一下,在这个过程中一些有特殊设计的RNN比如LSTM,GRU这些可能会有一些额外的量被计算出来,但是最终都会拿到一个outputs矩阵,里面储存着每一次计算过程中,对于该次喂进去的单词计算而得的隐层向量。通常而言,我们想要的是最后一个输出的隐层,因为其跑遍了所有的信息,因此我们从某种意义上可以相信其更贴切该句子的表示。

IMDB

这个数据集是国外友人的电影影评,可以理解成是从豆瓣上面爬下来的数据,经过人工看了之后,分为positive 和 negative两种进行标注。这个可以通过torchtext的api来做,但是这个其实挺蛋疼的。
因为如果按照其官方文档开始的展示来用,得到的train_iter = torchtext.datasets.IMDB(split='train'),其并不是一个dataset对象,而是一个奇了八怪的MapperIterDatapipe。尽管花了好几个小时研究这个东西,最后还是通过遍历的方式把数据全部拿出来,再用复写Dataset, DataLoader的形式做了一个自己的数据迭代器。

GloVe

博主最开始在做的时候为了表示单词,直接naive地通过torch.nn.Embedding随机初始化了一个编码层。虽然在做的时候还想过,这些随机初始化的编码不能表示这些词的意思,但是当时脑子一懵,觉得在这个数据量下可以通过训练的方式不断更新这个编码。但是事实表示年轻了,还是太年轻了,人生宝贵的半天就这么耗过去了。
也在这里提一下关于训练时候loss不降的一种观察角度,如果loss并不是严格不动的,换言之你的optimizer在干活,但是模型的表现一直很差,关于分类任务的输出通常和盲猜的结果相同。这个时候是代码层面错误的几率比较小,应该从模型的整体架构来看。另外一方面,如果loss一直不动都是那个数,那么需要查查是不是哪块的计算图被清掉了。

代码

开源是一个伟大的事情,希望自己未来能开源一些更有价值的东西

import torch
import torch.nn as nn
import torch.optim as optim
import torchtext.vocab.vocab as vocab
import torchtext
from torchtext import datasets
from torch.utils.data import DataLoader,Dataset
from collections import Counter, OrderedDict

BATCH_SIZE = 32
EPOCHS = 10
SHUFFLE = True
DEVICE = 'cuda' if torch.cuda.is_available() else 'cpu'

MOST_COMMON_SIZE = 40000
VOCAB_SIZE = MOST_COMMON_SIZE + 2 # unk pad
COMMENT_SIZE = 300

EMBED_SIZE = 50
HIDDEN_SIZE = 32

UNK_TOKEN = '<unk>'
PAD_TOKEN = '<pad>'
imdb_path = 'path_of_dataset'

GloVe = torchtext.vocab.GloVe('6B', 50, cache='/home/haolin_li/code/pretrained_models')

# 这俩就是上面提到的,Datapipe
train_imdb = datasets.IMDB(
    root = imdb_path,
    split = 'train'
)
test_imdb = datasets.IMDB(
    root = imdb_path,
    split = 'test'
)
# 把两个Datapipe里面数据全都拿出来
train_source_targets = []
train_source_comments = []
test_source_targets = []
test_source_comments = []
for target, comment in train_imdb:
    train_source_targets.append(target)
    train_source_comments.append(comment)
for target, comment in test_imdb:
    test_source_targets.append(target)
    test_source_comments.append(comment)
# 计算词频
word_counter = Counter()
tokenizer = torchtext.data.utils.get_tokenizer('basic_english')
for comment in train_source_comments:
    for word in tokenizer(comment):
        word_counter[word] += 1
# 前十个都是些没啥语义的 of  with that 这样的,所以直接去掉
most_common_words = word_counter.most_common(MOST_COMMON_SIZE+10)[10:
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
IMDb是一个全球知名的电影资料库网站,其中包含了大量的电影资讯和用户评论。而RNN是一种神经网络模型,可以用于序列数据的处理与分类。PyTorch则是一个深度学习库,提供了对神经网络的丰富支持。因此,IMDb RNN分类 PyTorch指的是使用PyTorch框架对IMDb数据集进行情感分类任务。 IMDb数据集包含了50,000条来自影评网站IMDb的评论数据,其中25,000条作为训练集,25,000条作为测试集。每条评论标记为正面或负面两类。 在使用PyTorch框架进行情感分类任务时,我们通常需要对数据进行以下几个处理步骤: 1. 数据预处理:包括对原始文本进行分词、去除停用词、生成词表等操作。 2. 数据编码:将预处理后的文本数据转换为数字化的向量,便于神经网络处理。 3. 模型设计:选择RNN网络结构,并根据数据特点进行双向LSTM、dropout等技巧的应用,构建一个有效的情感分类模型。 4. 模型训练:利用优化算法对模型进行训练,并监控训练过程中的精度、损失等指标,不断调整超参数,达到最佳效果。 5. 模型评估:在测试集上对模型进行评估,并计算出准确率、召回率、F1值等指标,评估模型性能。 在使用PyTorch进行IMDb RNN分类时,需要深入理解神经网络原理,熟悉PyTorch框架的使用方法,具备较好的编程能力,还需要对自然语言处理有一定了解和实践经验。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值