基于pytorch 的RNN实现文本分类

这篇具有很好参考价值的文章主要介绍了基于pytorch 的RNN实现文本分类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先,需要导入必要的库,包括torch、torchtext、numpy等:

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
from torchtext.datasets import AG_NEWS
from torchtext.data.utils import get_tokenizer
from collections import Counter

然后,我们需要加载数据集并进行数据预处理。在这里,我们使用AG News数据集,其中包含120,000个新闻文本,分为四个不同的类别:World、Sports、Business和Sci/Tech。我们首先定义一个函数来预处理数据:

# 加载数据集
train_dataset, test_dataset = AG_NEWS()

# 定义tokenizer,用于将文本转换为单词列表
tokenizer = get_tokenizer('basic_english')

# 定义函数preprocess,用于将文本转换为数值向量
def preprocess(dataset):
    # 定义空列表,用于存放文本
    data = []
    
    # 遍历数据集中的每个样本
    for (label, text) in dataset:
        # 将文本转换为单词列表
        tokens = tokenizer(text)
        # 将单词列表转换为数值向量
        vector = [vocab.stoi[token] for token in tokens]
        # 将标签和数值向量打包成元组,并添加到data列表中
        data.append((label, torch.tensor(vector)))
    
    return data

# 统计数据集中所有单词的出现频率,并将出现频率最高的50000个单词作为词汇表
counter = Counter()
for (label, text) in train_dataset:
    tokens = tokenizer(text)
    counter.update(tokens)
vocab = torchtext.vocab.Vocab(counter, max_size=50000)

# 使用preprocess函数将数据集转换为数值向量形式
train_data = preprocess(train_dataset)
test_data = preprocess(test_dataset)

接下来,我们定义一个RNN模型,用于对文本进行分类。这里我们使用LSTM作为我们的RNN模型,并将其应用于文本分类任务。LSTM是一种特殊的RNN模型,它能够在处理长序列时更好地保留先前的信息。下面是代码:

class LSTMModel(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super(LSTMModel, self).__init__()
        self.embedding = nn.Embedding(input_dim, hidden_dim)
        self.lstm = nn.LSTM(hidden_dim, hidden_dim)
        self.fc = nn.Linear(hidden_dim, output_dim)
        
    def forward(self, x):
        # 将输入x的每个元素(即每个数值向量)通过embedding层转换为向量
        embedded = self.embedding(x)
        # 将embedding后的向量输入到LSTM中
        output, (hidden, cell) = self.lstm(embedded)
        # 取LSTM的最后一个输出作为模型的输出
        prediction = self.fc(hidden[-1])
        return prediction

在上面的代码中,我们首先定义了一个名为LSTMModel的类,它继承自nn.Module类。在__init__中,我们定义了三个层:embedding层、LSTM层和全连接层(也称为线性层)。embedding层用于将输入的数值向量转换为向量表示,LSTM层用于在处理序列数据时保留先前的信息,全连接层用于将LSTM输出转换为预测标签。

在forward函数中,我们首先通过embedding层将输入x转换为向量表示,然后将其输入到LSTM中。由于LSTM是一种可以处理序列数据的RNN模型,因此它能够保留先前的信息,并生成一个输出向量。在这里,我们选择使用LSTM的最后一个输出作为模型的输出向量。最后,我们将输出向量输入到全连接层中,以生成最终的预测标签。

接下来,我们需要训练我们的模型。我们首先定义一个函数,用于计算模型在测试集上的准确率:

def evaluate(model, data):
    correct = 0
    total = 0
    with torch.no_grad():
        for (label, text) in data:
            output = model(text.unsqueeze(0)) # 将输入张量增加一维,以便输入模型
            predicted = torch.argmax(output.squeeze()) # 取最大值作为预测结果
            if predicted == label:
                correct += 1
            total += 1
    return correct / total

在上面的代码中,我们定义了一个名为evaluate的函数,该函数接受一个模型和数据作为输入,并返回模型在数据上的准确率。在函数中,我们首先将输入张量的维度增加一维,以便输入到模型中。然后,我们使用torch.argmax函数找到输出向量中的最大值,并将其作为预测结果。最后,我们计算模型在测试集上的准确率。

现在我们可以开始训练我们的模型了。我们首先定义一些超参数:

input_dim = len(vocab)
hidden_dim = 128
output_dim = 4
batch_size = 64
learning_rate = 0.001
num_epochs = 5

这里,我们定义了词汇表的大小、隐藏层的维度、输出维度、批次大小、学习率和训练轮数等超参数。

接下来,我们实例化我们的模型,并定义损失函数和优化器:

model = LSTMModel(input_dim, hidden_dim, output_dim)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

在上面的代码中,我们实例化了我们的模型LSTMModel,并定义了损失函数CrossEntropyLoss和优化器Adam。

现在,我们可以开始训练我们的模型了。对于每个epoch,我们将训练集分成若干个小批次,并对每个小批次进行训练。在每个小批次训练结束后,我们将测试集输入到我们的模型中,并计算模型的准确率。最后,我们输出每个epoch的损失和准确率:

for epoch in range(num_epochs):
    np.random.shuffle(train_data)
    train_loss = 0
    train_correct = 0
    train_total = 0
    
    for i in range(0, len(train_data), batch_size):
        batch = train_data[i:i+batch_size]
        labels, texts = zip(*batch)
        labels = torch.tensor(labels)
        texts = nn.utils.rnn.pad_sequence(texts, batch_first=True)
        optimizer.zero_grad()
        output = model(texts)
        loss = criterion(output, labels)
        loss.backward()
        optimizer.step()
        train_loss += loss.item() * len(batch)
        train_correct += torch.sum(torch.argmax(output, dim=1) == labels).item()
        train_total += len(batch)
        
    train_accuracy = train_correct / train_total
    test_accuracy = evaluate(model, test_data)
    print('Epoch [%d/%d], Loss: %.4f, Train Acc: %.4f, Test Acc: %.4f'
          % (epoch+1, num_epochs, train_loss / len(train_data),
             train_accuracy, test_accuracy))

在上面的代码中,我们使用np.random.shuffle函数对训练数据进行随机化处理,并按照batch_size的大小将其分成若干个小批次。在每个小批次训练结束后,我们将记录损失值、训练集准确率和测试集准确率。最后,我们输出每个epoch的损失和准确率。

到此,我们就完成了基于PyTorch的RNN实现文本分类的代码和解释。文章来源地址https://www.toymoban.com/news/detail-758043.html

到了这里,关于基于pytorch 的RNN实现文本分类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python深度学习026:基于Pytorch的典型循环神经网络模型RNN、LSTM、GRU的公式及简洁案例实现(官方)

    循环神经网络(也有翻译为递归神经网络)最典型的三种网络结构是: RNN(Recurrent Neural Network,循环神经网络) LSTM(Long Short-Term Memory,长短期记忆网络) GRU(Gate Recurrent Unit,门控循环单元) 理解参数的含义非常重要,否则,你不知道准备什么维度的输入数据送入模型 先

    2023年04月22日
    浏览(40)
  • NLP(8)--利用RNN实现多分类任务

    前言 仅记录学习过程,有问题欢迎讨论 循环神经网络RNN(recurrent neural network): 主要思想:将整个序列划分成多个时间步,将每一个时间步的信息依次输入模型,同时将模型输出的结果传给下一个时间步 自带了tanh的激活函数 代码 发现RNN效率高很多 可以对model 优化一下

    2024年04月26日
    浏览(34)
  • 深度学习-循环神经网络-RNN实现股价预测-LSTM自动生成文本

    基于文本内容及其前后信息进行预测 基于目标不同时刻状态进行预测 基于数据历史信息进行预测 序列模型:输入或者输出中包含有序列数据的模型 突出数据的前后序列关系 两大特点: 输入(输出)元素之间是具有顺序关系。不同的顺序,得到的结果应该是不同的,比如“

    2024年01月24日
    浏览(53)
  • pytorch笔记:RNN 系列

    来自B站视频,API查阅,TORCH.NN RNN可以处理变长序列,是因为其每个时刻的参数是共享的 RNN每算出一个时刻都可以输出,适合流式输出,但串行计算比较慢,无法获取太长的历史信息 RNN 初始隐状态不提供默认是0,输出包括两部分:所有时刻的输出 (batch_size,seq_len,out_hidden_si

    2024年02月11日
    浏览(54)
  • pytorch笔记:RNN

    来自B站视频,API查阅,TORCH.NN RNN可以处理变长序列,是因为其每个时刻的参数是共享的 RNN每算出一个时刻都可以输出,适合流式输出,但串行计算比较慢,无法获取太长的历史信息 RNN 初始隐状态不提供默认是0,输出包括两部分:所有时刻的输出 (batch_size,seq_len,out_hidden_si

    2024年02月09日
    浏览(33)
  • 基于PyTorch使用LSTM实现新闻文本分类任务

    PyTorch深度学习项目实战100例 https://weibaohang.blog.csdn.net/article/details/127154284?spm=1001.2014.3001.5501 基于PyTorch使用LSTM实现新闻文本分类任务的概况如下: 任务描述:新闻文本分类是一种常见的自然语言处理任务,旨在将新闻文章分为不同的类别,如政治、体育、科技等。 方法:使

    2024年02月09日
    浏览(43)
  • [PyTorch][chapter 44][RNN]

    简介             循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network) [1]  。             对循环神经网络的研究始于二十世纪80-

    2024年02月15日
    浏览(37)
  • 循环神经网络RNN用于分类任务

    RNN是一类 拥有隐藏状态,允许以前的输出可用于当前输入 的神经网络,  输入一个序列,对于序列中的每个元素与前一个元素的隐藏状态一起作为RNN的输入,通过计算当前的输出和隐藏状态。当前的影藏状态作为下一个单元的输入...   上图中的红色方块代表输入,蓝色方块

    2024年02月09日
    浏览(38)
  • PyTorch RNN的原理及其手写复现。

    先给出代码的实现(包括官方API和手动实现)然后逐步介绍RNN的优缺点,应用场景等。 在看代码之前有必要了解输入输出有哪些,以及他们的特性。 官方教程在: https://pytorch.org/docs/stable/generated/torch.nn.RNN.html#torch.nn.RNN 参数:(实例化时候可以传入的参数) input_size - 输入

    2024年02月08日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包