pytorch实现用CNN和LSTM对文本进行分类方式

yizhihongxing

在PyTorch中使用CNN和LSTM对文本进行分类的完整攻略如下,包括两个示例说明。

1. 示例1:使用CNN和LSTM对IMDB电影评论进行分类

在这个示例中,我们将使用CNN和LSTM对IMDB电影评论进行分类。以下是使用CNN和LSTM对文本进行分类的步骤:

  1. 准备数据集

首先需要准备IMDB电影评论数据集,并将其转换为PyTorch所支持的格式。可以使用torchtext库来加载和处理数据集。

```python
import torch
import torchtext
from torchtext.datasets import IMDB
from torchtext.data import Field, LabelField, BucketIterator

TEXT = Field(sequential=True, lower=True, batch_first=True)
LABEL = LabelField()

train_data, test_data = IMDB.splits(TEXT, LABEL)
TEXT.build_vocab(train_data, max_size=25000)
LABEL.build_vocab(train_data)
```

  1. 定义模型

可以使用CNN和LSTM结合的方式来对文本进行分类。以下是定义模型的示例代码:

```python
import torch.nn as nn

class TextCNNLSTM(nn.Module):
def init(self, vocab_size, embedding_dim, hidden_dim, output_dim, dropout):
super().init()

       self.embedding = nn.Embedding(vocab_size, embedding_dim)
       self.conv = nn.Conv2d(in_channels=1, out_channels=100, kernel_size=(3, embedding_dim))
       self.lstm = nn.LSTM(input_size=100, hidden_size=hidden_dim, num_layers=1, bidirectional=True)
       self.fc = nn.Linear(hidden_dim * 2, output_dim)
       self.dropout = nn.Dropout(dropout)

   def forward(self, text):
       embedded = self.embedding(text)
       embedded = embedded.unsqueeze(1)
       conv_output = nn.functional.relu(self.conv(embedded)).squeeze(3)
       lstm_output, (hidden, cell) = self.lstm(conv_output)
       hidden = self.dropout(torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim=1))
       output = self.fc(hidden)
       return output

```

  1. 训练模型

定义好模型后,可以使用PyTorch的torch.utils.data.DataLoadertorch.optim来训练模型。以下是训练模型的示例代码:

```python
import torch.optim as optim
from torch.utils.data import DataLoader

BATCH_SIZE = 64
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

train_iterator, test_iterator = BucketIterator.splits(
(train_data, test_data),
batch_size=BATCH_SIZE,
device=device
)

model = TextCNNLSTM(len(TEXT.vocab), 100, 256, len(LABEL.vocab), 0.5)
optimizer = optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss()

model = model.to(device)
criterion = criterion.to(device)

def train(model, iterator, optimizer, criterion):
epoch_loss = 0
epoch_acc = 0

   model.train()

   for batch in iterator:
       optimizer.zero_grad()

       predictions = model(batch.text).squeeze(1)
       loss = criterion(predictions, batch.label)
       acc = binary_accuracy(predictions, batch.label)

       loss.backward()
       optimizer.step()

       epoch_loss += loss.item()
       epoch_acc += acc.item()

   return epoch_loss / len(iterator), epoch_acc / len(iterator)

def evaluate(model, iterator, criterion):
epoch_loss = 0
epoch_acc = 0

   model.eval()

   with torch.no_grad():
       for batch in iterator:
           predictions = model(batch.text).squeeze(1)
           loss = criterion(predictions, batch.label)
           acc = binary_accuracy(predictions, batch.label)

           epoch_loss += loss.item()
           epoch_acc += acc.item()

   return epoch_loss / len(iterator), epoch_acc / len(iterator)

def binary_accuracy(preds, y):
rounded_preds = torch.round(torch.sigmoid(preds))
correct = (rounded_preds == y).float()
acc = correct.sum() / len(correct)
return acc

N_EPOCHS = 10

for epoch in range(N_EPOCHS):
train_loss, train_acc = train(model, train_iterator, optimizer, criterion)
valid_loss, valid_acc = evaluate(model, test_iterator, criterion)

   print(f'Epoch: {epoch+1:02}')
   print(f'\tTrain Loss: {train_loss:.3f} | Train Acc: {train_acc*100:.2f}%')
   print(f'\t Val. Loss: {valid_loss:.3f} |  Val. Acc: {valid_acc*100:.2f}%')

```

  1. 测试模型

训练好模型后,可以使用测试集来测试模型的性能。以下是测试模型的示例代码:

```python
def predict_sentiment(model, sentence):
model.eval()
tokenized = [tok.text for tok in nlp.tokenizer(sentence)]
indexed = [TEXT.vocab.stoi[t] for t in tokenized]
tensor = torch.LongTensor(indexed).to(device)
tensor = tensor.unsqueeze(1)
prediction = torch.sigmoid(model(tensor))
return prediction.item()

print(predict_sentiment(model, "This film is terrible"))
print(predict_sentiment(model, "This film is great"))
```

2. 示例2:使用CNN和LSTM对中文文本进行分类

如果要对中文文本进行分类,可以使用相同的方法。以下是使用CNN和LSTM对中文文本进行分类的示例代码:

  1. 准备数据集

首先需要准备中文文本数据集,并将其转换为PyTorch所支持的格式。可以使用torchtext库来加载和处理数据集。

```python
import torchtext
from torchtext.datasets import text_classification
from torchtext.data.utils import get_tokenizer
from collections import Counter

tokenizer = get_tokenizer('basic_english')
train_dataset, test_dataset = text_classification.DATASETS'AG_NEWS'
```

  1. 定义模型

可以使用CNN和LSTM结合的方式来对文本进行分类。以下是定义模型的示例代码:

```python
import torch.nn as nn

class TextCNNLSTM(nn.Module):
def init(self, vocab_size, embedding_dim, hidden_dim, output_dim, dropout):
super().init()

       self.embedding = nn.Embedding(vocab_size, embedding_dim)
       self.conv = nn.Conv2d(in_channels=1, out_channels=100, kernel_size=(3, embedding_dim))
       self.lstm = nn.LSTM(input_size=100, hidden_size=hidden_dim, num_layers=1, bidirectional=True)
       self.fc = nn.Linear(hidden_dim * 2, output_dim)
       self.dropout = nn.Dropout(dropout)

   def forward(self, text):
       embedded = self.embedding(text)
       embedded = embedded.unsqueeze(1)
       conv_output = nn.functional.relu(self.conv(embedded)).squeeze(3)
       lstm_output, (hidden, cell) = self.lstm(conv_output)
       hidden = self.dropout(torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim=1))
       output = self.fc(hidden)
       return output

```

  1. 训练模型

定义好模型后,可以使用PyTorch的torch.utils.data.DataLoadertorch.optim来训练模型。以下是训练模型的示例代码:

```python
import torch.optim as optim
from torch.utils.data import DataLoader

BATCH_SIZE = 64
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=True)

model = TextCNNLSTM(len(train_dataset.get_vocab()), 100, 256, len(train_dataset.get_labels()), 0.5)
optimizer = optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss()

model = model.to(device)
criterion = criterion.to(device)

def train(model, iterator, optimizer, criterion):
epoch_loss = 0
epoch_acc = 0

   model.train()

   for batch in iterator:
       optimizer.zero_grad()

       predictions = model(batch.text).squeeze(1)
       loss = criterion(predictions, batch.label)
       acc = binary_accuracy(predictions, batch.label)

       loss.backward()
       optimizer.step()

       epoch_loss += loss.item()
       epoch_acc += acc.item()

   return epoch_loss / len(iterator), epoch_acc / len(iterator)

def evaluate(model, iterator, criterion):
epoch_loss = 0
epoch_acc = 0

   model.eval()

   with torch.no_grad():
       for batch in iterator:
           predictions = model(batch.text).squeeze(1)
           loss = criterion(predictions, batch.label)
           acc = binary_accuracy(predictions, batch.label)

           epoch_loss += loss.item()
           epoch_acc += acc.item()

   return epoch_loss / len(iterator), epoch_acc / len(iterator)

def binary_accuracy(preds, y):
rounded_preds = torch.round(torch.sigmoid(preds))
correct = (rounded_preds == y).float()
acc = correct.sum() / len(correct)
return acc

N_EPOCHS = 10

for epoch in range(N_EPOCHS):
train_loss, train_acc = train(model, train_loader, optimizer, criterion)
valid_loss, valid_acc = evaluate(model, test_loader, criterion)

   print(f'Epoch: {epoch+1:02}')
   print(f'\tTrain Loss: {train_loss:.3f} | Train Acc: {train_acc*100:.2f}%')
   print(f'\t Val. Loss: {valid_loss:.3f} |  Val. Acc: {valid_acc*100:.2f}%')

```

  1. 测试模型

训练好模型后,可以使用测试集来测试模型的性能。以下是测试模型的示例代码:

```python
def predict_sentiment(model, sentence):
model.eval()
tokenized = tokenizer(sentence)
indexed = [train_dataset.get_vocab()[t] for t in tokenized]
tensor = torch.LongTensor(indexed).to(device)
tensor = tensor.unsqueeze(1)
prediction = torch.sigmoid(model(tensor))
return prediction.item()

print(predict_sentiment(model, "This is a good news"))
print(predict_sentiment(model, "This is a bad news"))
```

以上就是使用CNN和LSTM对文本进行分类的完整攻略,包括两个示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch实现用CNN和LSTM对文本进行分类方式 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Pytorch evaluation每次运行结果不同的解决

    在PyTorch中,由于随机数种子的不同,每次运行模型的结果可能会有所不同。这可能会导致我们难以比较不同模型的性能,或者难以重现实验结果。为了解决这个问题,我们可以设置随机数种子,以确保每次运行模型的结果都是相同的。 以下是两种设置随机数种子的方法: 方法1:设置PyTorch的随机数种子 我们可以使用torch.manual_seed()函数设置PyTor…

    PyTorch 2023年5月15日
    00
  • Pytorch 如何查看、释放已关闭程序占用的GPU资源

    在PyTorch中,我们可以使用torch.cuda.memory_allocated()和torch.cuda.memory_cached()函数来查看当前程序占用的GPU内存。同时,我们还可以使用torch.cuda.empty_cache()函数来释放已关闭程序占用的GPU资源。 以下是详细的攻略: 查看GPU内存占用 我们可以使用torch.cuda…

    PyTorch 2023年5月15日
    00
  • pytorch中如何在lstm中输入可变长的序列

    PyTorch 训练 RNN 时,序列长度不固定怎么办? pytorch中如何在lstm中输入可变长的序列 上面两篇文章写得很好,把LSTM中训练变长序列所需的三个函数讲解的很清晰,但是这两篇文章没有给出完整的训练代码,并且没有写关于带label的情况,为此,本文给出一个完整的带label的训练代码: import torch from torch impo…

    2023年4月7日
    00
  • pytorch网络的创建和与训练模型的加载

      本文是PyTorch使用过程中的的一些总结,有以下内容: 构建网络模型的方法 网络层的遍历 各层参数的遍历 模型的保存与加载 从预训练模型为网络参数赋值 主要涉及到以下函数的使用 add_module,ModulesList,Sequential 模型创建 modules(),named_modules(),children(),named_childr…

    PyTorch 2023年4月6日
    00
  • 在Pytorch中计算自己模型的FLOPs方式

    在PyTorch中,我们可以使用thop库来计算自己模型的FLOPs。thop是一个轻量级的库,可以计算PyTorch模型的FLOPs、参数数量和模型大小等指标。下面是一个详细的攻略,演示如何在PyTorch中计算自己模型的FLOPs。 步骤一:安装thop库 首先,我们需要安装thop库。可以使用pip命令来安装thop库: pip install tho…

    PyTorch 2023年5月15日
    00
  • PyTorch错误解决:XXX is a zip archive(did you mean to use torch.jit.load()?)

    错误原因: 训练保存模型时,torch的版本是1.6.0(使用torch.__version__可以查看torch的版本号) 而加载模型时,torch的版本号低于1.6.0   解决方案: If for any reason you want torch.save to use the old format, pass the kwarg _use_new_…

    PyTorch 2023年4月7日
    00
  • 如何入门Pytorch之一:Pytorch基本知识介绍

    前言        PyTorch和Tensorflow是目前最为火热的两大深度学习框架,Tensorflow主要用户群在于工业界,而PyTorch主要用户分布在学术界。目前视觉三大顶会的论文大多都是基于PyTorch,如何快速入门PyTorch成了当务之急。 正文       本着循序渐进的原则,我会依次从易到难的内容进行介绍,并采用定期更新的方式来补充该…

    2023年4月6日
    00
  • 关于tf.matmul() 和tf.multiply() 的区别说明

    tf.matmul()和tf.multiply()是TensorFlow中的两个重要函数,它们分别用于矩阵乘法和元素级别的乘法。本文将详细讲解tf.matmul()和tf.multiply()的区别,并提供两个示例说明。 tf.matmul()和tf.multiply()的区别 tf.matmul()和tf.multiply()的区别在于它们执行的操作不同。…

    PyTorch 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部