循环神经网络五-使用LSTM完成文本情感分类

在前面使用word embedding去实现了文本情感分类。那么现在在这个模型中添加上LSTM层,为了达到更好的效果,做一下修改

1.MAX_LEN=200

2.构建dataset的过程,将数据转化为2分类,前面是十分类。pos类为1,neg为0,因为25000个要本做十分类数据量太小了

3.在实例化LSTM的时候,使用dropout=0.5,在模型评估过程中,dropout自动会为0

一.修改模型

python 复制代码
"""构建模型model.py文件"""
import torch.nn as nn
import torch
import config
import torch.nn.functional as F

class IMDBLstmmodel(nn.Module):
    def __init__(self):
        super(IMDBLstmmodel,self).__init__()
        self.hidden_size = 64   # 设置隐藏个数
        self.embedding_dim = 200  # 设置一个词语用多大的向量表示
        self.num_layer = 2   # 设置隐藏层数量
        self.bidriectional = True  # 是否使用双向LSTM
        self.bi_num = 2 if self.bidriectional else 1
        self.dropout = 0.5 
        #以上部分为超参数,可以自行修改

        self.embedding = nn.Embedding(len(config.ws),self.embedding_dim,padding_idx=config.ws.PAD) #实例化embedding[N,300]
        self.lstm = nn.LSTM(self.embedding_dim,self.hidden_size,self.num_layer,bidirectional=True,dropout=self.dropout)  # 实例化lstm
        #使用两个全连接层,中间使用relu激活函数
        self.fc = nn.Linear(self.hidden_size*self.bi_num,20)  
        self.fc2 = nn.Linear(20,2)


    def forward(self, x):
        x = self.embedding(x)
        x = x.permute(1,0,2) #进行轴交换
        h_0,c_0 = self.init_hidden_state(x.size(1))
        _,(h_n,c_n) = self.lstm(x,(h_0,c_0))

        #只要最后一个lstm单元处理的结果,这里多去的hidden state
        out = torch.cat([h_n[-2, :, :], h_n[-1, :, :]], dim=-1)
        out = self.fc(out)
        out = F.relu(out)
        out = self.fc2(out)
        return F.log_softmax(out,dim=-1)

    def init_hidden_state(self,batch_size):
        h_0 = torch.rand(self.num_layer * self.bi_num, batch_size, self.hidden_size).to(device)
        c_0 = torch.rand(self.num_layer * self.bi_num, batch_size, self.hidden_size).to(device)
        return h_0,c_0

二.完成训练和测试代码

python 复制代码
train_batch_size = 64
test_batch_size = 5000
# imdb_model = IMDBModel(MAX_LEN) #基础model
imdb_model = IMDBLstmmodel().to(device) #在gpu上运行,提高运行速度
# imdb_model.load_state_dict(torch.load("model/mnist_net.pkl"))
optimizer = optim.Adam(imdb_model.parameters())
criterion = nn.CrossEntropyLoss()

def train(epoch):
    mode = True
    imdb_model.train(mode)
    train_dataloader =get_dataloader(mode,train_batch_size)
    for idx,(target,input,input_lenght) in enumerate(train_dataloader):
        target = target.to(device)
        input = input.to(device)
        optimizer.zero_grad()
        output = imdb_model(input)
        loss = F.nll_loss(output,target) #traget需要是[0,9],不能是[1-10]
        loss.backward()
        optimizer.step()
        if idx %10 == 0:
            pred = torch.max(output, dim=-1, keepdim=False)[-1]
            acc = pred.eq(target.data).cpu().numpy().mean()*100.

            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}\t ACC: {:.6f}'.format(epoch, idx * len(input), len(train_dataloader.dataset),
                       100. * idx / len(train_dataloader), loss.item(),acc))

            torch.save(imdb_model.state_dict(), "model/mnist_net.pkl")
            torch.save(optimizer.state_dict(), 'model/mnist_optimizer.pkl')
            
 def test():
    mode = False
    imdb_model.eval()
    test_dataloader = get_dataloader(mode, test_batch_size)
    with torch.no_grad():
        for idx,(target, input, input_lenght) in enumerate(test_dataloader):
            target = target.to(device)
            input = input.to(device)
            output = imdb_model(input)
            test_loss  = F.nll_loss(output, target,reduction="mean")
            pred = torch.max(output,dim=-1,keepdim=False)[-1]
            correct = pred.eq(target.data).sum()
            acc = 100. * pred.eq(target.data).cpu().numpy().mean()
            print('idx: {} Test set: Avg. loss: {:.4f}, Accuracy: {}/{} ({:.2f}%)\n'.format(idx,test_loss, correct, target.size(0),acc))
            
 if __name__ == "__main__":
    test()
    for i in range(10):
        train(i)
        test()
相关推荐
王哈哈^_^2 小时前
【完整源码+数据集】道路拥塞数据集,yolo道路拥塞检测数据集 8921 张,交通拥堵识别数据集,路口拥塞识别系统实战教程
深度学习·算法·yolo·目标检测·计算机视觉·分类·毕业设计
傻啦嘿哟18 小时前
Python自动整理音乐文件:按艺术家和专辑分类歌曲
数据库·python·分类
算法与编程之美20 小时前
探索不同的损失函数对分类精度的影响.
人工智能·算法·机器学习·分类·数据挖掘
hans汉斯21 小时前
基于数据重构与阈值自适应的信用卡欺诈不平衡分类模型研究
大数据·算法·机器学习·重构·分类·数据挖掘·机器人
Maxwell_li11 天前
机器学习知识点梳理(回归模型、分类模型、聚类模型、评估方法)-思维导图
机器学习·分类·回归·聚类
Maxwell_li11 天前
机器学习知识点梳理(回归模型、分类模型、聚类模型、评估方法)
机器学习·分类·回归·学习方法·聚类·改行学it
深度学习实战训练营1 天前
结合 Swin Transformer 与 LSTM 的残差自回归模型,用于高精度光学波前时序预测与相位重建
回归·lstm·transformer
Coding茶水间1 天前
基于深度学习的轮船分类检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
深度学习·yolo·分类
冰西瓜6001 天前
从项目入手机器学习——鸢尾花分类
人工智能·机器学习·分类·数据挖掘
Hcoco_me2 天前
大模型面试题23:对比学习原理-从通俗理解到核心逻辑(通用AI视角)
人工智能·rnn·深度学习·学习·自然语言处理·word2vec