pytorch搭建TextRCNN模型与使用案例

论文地址:http://www.nlpr.ia.ac.cn/cip/~liukang/liukangPageFile/Recurrent%20Convolutional%20Neural%20Networks%20for%20Text%20Classification.pdf

在这里插入图片描述

案例代码

直接运行即可,然后根据自己的任务做

#!/usr/bin/env Python
# coding=utf-8
import torch
import torch.nn as nn
import torch.utils.data as Data
import torch.nn.functional as F


class TextRCNNModel(nn.Module):
    def __init__(self, config):
        super(TextRCNNModel, self).__init__()
        self.lstm = nn.LSTM(config['embedding_size'], config['lstm_hidden_size'], 1,
                            bidirectional=True, batch_first=True)
        self.maxpool = nn.MaxPool1d(config['pad_size'])
        self.fc = nn.Linear(config['lstm_hidden_size'] * 2  # 由于是双向LSTM,所以这里 * 2
                            + config['embedding_size'], config['output_size'])

    def forward(self, x):
        out, _ = self.lstm(x)
        out = torch.cat((x, out), 2)
        out = F.relu(out)
        out = out.permute(0, 2, 1)
        out = self.maxpool(out).squeeze()
        out = self.fc(out)
        return out


def get_total_train_data(word_embedding_size, class_count, pad_size):
    """得到全部的训练数据,这里需要替换成自己的数据"""
    import numpy as np
    x_train = torch.Tensor(
        np.random.random((1000, pad_size, word_embedding_size)))  # 维度是 [ 数据量, 一句话的词个数, 每个词的embedding]
    y_train = torch.Tensor(
        np.random.randint(0, class_count, size=(1000, 1))).long()  # [ 数据量, 句子的分类], 这里的class_count=4,就是四分类任务
    return x_train, y_train


if __name__ == '__main__':
    # ================训练参数=================
    epochs = 1000
    batch_size = 30
    output_class = 14
    embedding_size = 350
    # ================模型参数=================
    config = {
        # 重要参数
        'embedding_size': embedding_size,  # 输入的字的embedding的长度
        'output_size': output_class,  # 最终分类任务的数量
        'pad_size': 40,  # 每句话的字的个数
        # 次要参数
        'lstm_hidden_size': 256,

    }

    # ================开始训练================
    x_train, y_train = get_total_train_data(embedding_size, output_class, config['pad_size'])
    train_loader = Data.DataLoader(
        dataset=Data.TensorDataset(x_train, y_train),  # 封装进Data.TensorDataset()类的数据,可以为任意维度
        batch_size=batch_size,  # 每块的大小
        shuffle=True,  # 要不要打乱数据 (打乱比较好)
        num_workers=6,  # 多进程(multiprocess)来读数据
        drop_last=True,
    )
    model = TextRCNNModel(config=config)
    cross_loss = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # 优化器
    model.train()
    for i in range(epochs):
        for seq, labels in train_loader:
            optimizer.zero_grad()
            y_pred = model(seq)  # 压缩维度:得到输出,并将维度为1的去除
            single_loss = cross_loss(y_pred, labels.squeeze())
            single_loss.backward()
            optimizer.step()
            print("Step: " + str(i) + " loss : " + str(single_loss.detach().numpy()))
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会给你讲解基于PyTorchTextRCNN模型搭建用于文本分类。首先,我们需要导入PyTorch和其他必要的库: ```python import torch import torch.nn as nn import torch.nn.functional as F ``` 接下来,我们需要定义TextRCNN模型: ```python class TextRCNN(nn.Module): def __init__(self, vocab_size, embedding_dim, hidden_dim, num_classes): super(TextRCNN, self).__init__() self.embedding = nn.Embedding(vocab_size, embedding_dim) self.lstm = nn.LSTM(embedding_dim, hidden_dim, batch_first=True, bidirectional=True) self.fc = nn.Linear(hidden_dim * 2 + embedding_dim, num_classes) def forward(self, x): embed = self.embedding(x) lstm_out, _ = self.lstm(embed) concated = torch.cat((embed, lstm_out), 2) out = F.relu(concated) out = out.permute(0, 2, 1) out = F.max_pool1d(out, out.size(2)).squeeze(2) out = self.fc(out) return out ``` 在这个模型中,我们定义了一个Embedding层,一个双向LSTM层,一个全连接层。在forward函数中,我们首先对输入的文本进行Embedding,然后将Embedding结果输入到LSTM中进行处理,接着将Embedding和LSTM的输出拼接在一起,然后通过一个ReLU层进行激活,接着进行最大池化,最后通过全连接层得到输出。 接下来,我们需要定义模型的超参数和优化器: ```python VOCAB_SIZE = len(TEXT.vocab) EMBEDDING_DIM = 100 HIDDEN_DIM = 128 NUM_CLASSES = 2 model = TextRCNN(VOCAB_SIZE, EMBEDDING_DIM, HIDDEN_DIM, NUM_CLASSES) optimizer = torch.optim.Adam(model.parameters()) ``` 在这个例子中,我们使用Adam优化器。 最后,我们就可以开始训练模型了: ```python NUM_EPOCHS = 10 for epoch in range(NUM_EPOCHS): for batch in train_iterator: optimizer.zero_grad() text, text_lengths = batch.text predictions = model(text) loss = F.cross_entropy(predictions, batch.label) loss.backward() optimizer.step() ``` 以上就是基于PyTorchTextRCNN模型搭建用于文本分类的完整代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆萌的代Ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值