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

在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调用gpu

    第一步!指定gpu import osos.environ[“CUDA_VISIBLE_DEVICES”] = ‘0’ 第二步! 对于每一个要踹到gpu去的Tensor或者model x 使用x = x.cuda()就ok了 嘤嘤嘤

    PyTorch 2023年4月6日
    00
  • PyTorch Geometric Temporal 介绍 —— 数据结构和RGCN的概念

    Introduction PyTorch Geometric Temporal is a temporal graph neural network extension library for PyTorch Geometric. PyTorch Geometric Temporal 是基于PyTorch Geometric的对时间序列图数据的扩展。 Dat…

    PyTorch 2023年4月8日
    00
  • windows 安装 pytorch

    之前都在服务器上跑pytorch,近来发现新版本可在windows上跑了,甚是开心。 环境: windows7  python3 无CPU 步骤: 1. 确保确保python版本在3.5.3/3.6.2及以上版本,更新时只需下载所需的python setup exe,会有更新提示,无需 2. 到pytorch官网 https://pytorch.org/  …

    2023年4月8日
    00
  • pytorch实现Tensor变量之间的转换

    在PyTorch中,我们可以使用torch.Tensor对象来表示张量,并使用一些函数来实现张量之间的转换。以下是两个示例说明。 示例1:使用torch.Tensor对象进行转换 import torch # 定义一个张量 x = torch.randn(2, 3) print(x) # 将张量转换为numpy数组 x_np = x.numpy() prin…

    PyTorch 2023年5月16日
    00
  • pytorch使用指定GPU训练的实例

    在PyTorch中,我们可以使用指定的GPU来训练模型。在本文中,我们将详细讲解如何使用指定的GPU来训练模型。我们将使用两个示例来说明如何完成这些步骤。 示例1:使用单个GPU训练模型 以下是使用单个GPU训练模型的步骤: import torch import torch.nn as nn import torch.optim as optim # 检查…

    PyTorch 2023年5月15日
    00
  • 基于pytorch框架的yolov5训练与pycharm远程连接服务器

    yolov5 pytorch工程准备与环境部署 yolov5训练数据准备 yolov5训练 pycharm远程连接 pycharm解释器配置 测试 1.  yolov5 pytorch工程准备与环境部署 (1)下载yolov5工程pytorch版本源码 https://github.com/ultralytics/yolov5 (2)环境部署 用anacon…

    2023年4月8日
    00
  • pytorch 更改预训练模型网络结构的方法

    在PyTorch中,我们可以使用预训练模型来加速模型训练和提高模型性能。但是,有时候我们需要更改预训练模型的网络结构以适应我们的任务需求。以下是使用PyTorch更改预训练模型网络结构的完整攻略,包括两个示例说明。 1. 更改预训练模型的全连接层 以下是使用PyTorch更改预训练模型的全连接层的步骤: 导入必要的库 python import torch …

    PyTorch 2023年5月15日
    00
  • Pytorch搭建YoloV5目标检测平台实现过程

    以下是使用PyTorch搭建YoloV5目标检测平台的完整攻略,包括两个示例说明。 环境准备 在开始之前,需要确保已经安装了以下软件和库: Python 3.6或更高版本 PyTorch 1.7或更高版本 CUDA 10.2或更高版本 cuDNN 7.6或更高版本 OpenCV 4.2或更高版本 示例1:使用YoloV5检测图像中的物体 以下是一个示例,展示…

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