pytorch+lstm实现的pos示例

在自然语言处理中,词性标注(Part-of-Speech Tagging,POS)是一个重要的任务。它的目标是为给定的文本中的每个单词标注其词性,例如名词、动词、形容词等。在PyTorch中,我们可以使用LSTM模型来实现POS任务。

以下是两个示例代码,展示了如何使用PyTorch和LSTM模型实现POS任务:

示例1:使用PyTorch和LSTM模型实现POS任务

import torch
import torch.nn as nn

# 定义一个LSTM模型
class LSTMTagger(nn.Module):
    def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size):
        super(LSTMTagger, self).__init__()
        self.hidden_dim = hidden_dim
        self.word_embeddings = nn.Embedding(vocab_size, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim, hidden_dim)
        self.hidden2tag = nn.Linear(hidden_dim, tagset_size)
        self.hidden = self.init_hidden()

    def init_hidden(self):
        return (torch.zeros(1, 1, self.hidden_dim),
                torch.zeros(1, 1, self.hidden_dim))

    def forward(self, sentence):
        embeds = self.word_embeddings(sentence)
        lstm_out, self.hidden = self.lstm(
            embeds.view(len(sentence), 1, -1), self.hidden)
        tag_space = self.hidden2tag(lstm_out.view(len(sentence), -1))
        tag_scores = nn.functional.log_softmax(tag_space, dim=1)
        return tag_scores

# 定义训练数据和测试数据
training_data = [(
    "The cat ate the mouse".split(),
    "DET NOUN VERB DET NOUN".split()
), (
    "The dog chased the cat".split(),
    "DET NOUN VERB DET NOUN".split()
)]

word_to_ix = {}
for sent, tags in training_data:
    for word in sent:
        if word not in word_to_ix:
            word_to_ix[word] = len(word_to_ix)

tag_to_ix = {"DET": 0, "NOUN": 1, "VERB": 2}

# 定义模型参数
EMBEDDING_DIM = 6
HIDDEN_DIM = 6

# 初始化模型
model = LSTMTagger(EMBEDDING_DIM, HIDDEN_DIM, len(word_to_ix), len(tag_to_ix))
loss_function = nn.NLLLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

# 训练模型
for epoch in range(300):
    for sentence, tags in training_data:
        model.zero_grad()
        model.hidden = model.init_hidden()
        sentence_in = torch.tensor([word_to_ix[word] for word in sentence], dtype=torch.long)
        targets = torch.tensor([tag_to_ix[tag] for tag in tags], dtype=torch.long)
        tag_scores = model(sentence_in)
        loss = loss_function(tag_scores, targets)
        loss.backward()
        optimizer.step()

# 测试模型
with torch.no_grad():
    inputs = torch.tensor([word_to_ix[word] for word in "The cat chased the mouse".split()], dtype=torch.long)
    tag_scores = model(inputs)
    print(tag_scores)

在上面的示例代码中,我们首先定义了一个LSTM模型,包含一个嵌入层、一个LSTM层和一个线性层。然后,我们定义了训练数据和测试数据,并使用这些数据训练和测试模型。在训练模型时,我们使用随机梯度下降(SGD)优化器和负对数似然损失函数。在测试模型时,我们使用torch.no_grad()上下文管理器禁用梯度计算,并将测试数据传入模型进行前向计算。

示例2:使用PyTorch和LSTM模型实现POS任务(使用预训练的词向量)

import torch
import torch.nn as nn
import torchtext

# 加载预训练的词向量
glove = torchtext.vocab.GloVe(name="6B", dim=100)

# 定义一个LSTM模型
class LSTMTagger(nn.Module):
    def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size, pretrained_embeddings):
        super(LSTMTagger, self).__init__()
        self.hidden_dim = hidden_dim
        self.word_embeddings = nn.Embedding.from_pretrained(pretrained_embeddings)
        self.lstm = nn.LSTM(embedding_dim, hidden_dim)
        self.hidden2tag = nn.Linear(hidden_dim, tagset_size)
        self.hidden = self.init_hidden()

    def init_hidden(self):
        return (torch.zeros(1, 1, self.hidden_dim),
                torch.zeros(1, 1, self.hidden_dim))

    def forward(self, sentence):
        embeds = self.word_embeddings(sentence)
        lstm_out, self.hidden = self.lstm(
            embeds.view(len(sentence), 1, -1), self.hidden)
        tag_space = self.hidden2tag(lstm_out.view(len(sentence), -1))
        tag_scores = nn.functional.log_softmax(tag_space, dim=1)
        return tag_scores

# 定义训练数据和测试数据
training_data = [(
    "The cat ate the mouse".split(),
    "DET NOUN VERB DET NOUN".split()
), (
    "The dog chased the cat".split(),
    "DET NOUN VERB DET NOUN".split()
)]

word_to_ix = {}
for sent, tags in training_data:
    for word in sent:
        if word not in word_to_ix:
            word_to_ix[word] = len(word_to_ix)

tag_to_ix = {"DET": 0, "NOUN": 1, "VERB": 2}

# 定义模型参数
EMBEDDING_DIM = 100
HIDDEN_DIM = 6

# 初始化模型
pretrained_embeddings = torch.zeros(len(word_to_ix), EMBEDDING_DIM)
for word, idx in word_to_ix.items():
    if word in glove.stoi:
        pretrained_embeddings[idx] = glove[word]
model = LSTMTagger(EMBEDDING_DIM, HIDDEN_DIM, len(word_to_ix), len(tag_to_ix), pretrained_embeddings)
loss_function = nn.NLLLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

# 训练模型
for epoch in range(300):
    for sentence, tags in training_data:
        model.zero_grad()
        model.hidden = model.init_hidden()
        sentence_in = torch.tensor([word_to_ix[word] for word in sentence], dtype=torch.long)
        targets = torch.tensor([tag_to_ix[tag] for tag in tags], dtype=torch.long)
        tag_scores = model(sentence_in)
        loss = loss_function(tag_scores, targets)
        loss.backward()
        optimizer.step()

# 测试模型
with torch.no_grad():
    inputs = torch.tensor([word_to_ix[word] for word in "The cat chased the mouse".split()], dtype=torch.long)
    tag_scores = model(inputs)
    print(tag_scores)

在上面的示例代码中,我们首先加载了预训练的词向量,并使用这些词向量初始化了嵌入层。然后,我们定义了一个LSTM模型,包含一个嵌入层、一个LSTM层和一个线性层。在初始化模型时,我们使用预训练的词向量初始化了嵌入层。在训练模型时,我们使用随机梯度下降(SGD)优化器和负对数似然损失函数。在测试模型时,我们使用torch.no_grad()上下文管理器禁用梯度计算,并将测试数据传入模型进行前向计算。

需要注意的是,在实际应用中,我们可能需要使用更大的数据集和更复杂的模型来实现更好的POS性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch+lstm实现的pos示例 - Python技术站

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

相关文章

  • pytorch 不同学习率设置方法

    最近注意到在一些caffe模型中,偏置项的学习率通常设置为普通层的两倍。具体原因可以参考(https://datascience.stackexchange.com/questions/23549/why-is-the-learning-rate-for-the-bias-usually-twice-as-large-as-the-the-lr-for-t)…

    2023年4月6日
    00
  • PyTorch中的CUDA的操作方法

    在PyTorch中,我们可以使用CUDA加速模型的训练和推理。本文将介绍PyTorch中的CUDA操作方法,并提供两个示例说明。 PyTorch中的CUDA操作方法 检查CUDA是否可用 在PyTorch中,我们可以使用torch.cuda.is_available()函数检查CUDA是否可用。如果CUDA可用,则返回True,否则返回False。 以下是一…

    PyTorch 2023年5月16日
    00
  • ubuntu20.04安装cuda10.2+pytorch+NVIDIA驱动安装+(Installation failed log: [ERROR])

    最近申请了服务器,需要自己去搭建环境,所以在此记录下自己的辛酸搭建历史,也为了以后自己不走弯路。话不多说直接搬运,因为我也是用的别人的方法,一路走下来很顺畅。 第一步首先安装英伟达驱动因为之前吃过亏,安装了ubuntu后直接装了cuda,结果没有任何效果,还连图形界面都出现不了(因为之前按照大佬们的攻略先一步禁用了ubuntu自带的显卡驱动,而自己又没有先装…

    2023年4月8日
    00
  • pytorch简介

    下面是关于“PyTorch简介”的完整攻略。 PyTorch简介 PyTorch是一个基于Python的科学计算库,它是一个用于构建深度学习模型的开源机器学习框架。PyTorch提供了一组用于构建、训练和部署深度学习模型的工具和接口。PyTorch的核心是张量(Tensor),它是一种多维数组,可以用于表示向量、矩阵、图像、视频等数据。PyTorch还提供了…

    PyTorch 2023年5月15日
    00
  • pytorch深度学习神经网络实现手写字体识别

    利用平pytorch搭建简单的神经网络实现minist手写字体的识别,采用三层线性函数迭代运算,使得其具备一定的非线性转化与运算能力,其数学原理如下: 其具体实现代码如下所示:import torchimport matplotlib.pyplot as pltdef plot_curve(data): #曲线输出函数构建 fig=plt.figure() …

    2023年4月8日
    00
  • 运行pytorch代码遇到的error解决办法

    1.no CUDA-capable device is detected 首先考虑的是cuda的驱动问题,查看gpu显示是否正常,然后更新最新的cuda驱动; 第二个考虑的是cuda设备的默认参数是否修改,平常一块显卡的设置是0,多块可能会修改此参数: CUDA_VISIBLE_DEVICES=”3″  ,把它修改为0即可解决。 2.out of gpu m…

    PyTorch 2023年4月7日
    00
  • Python LeNet网络详解及pytorch实现

    Python LeNet网络详解及PyTorch实现 本文将介绍LeNet网络的结构和实现,并使用PyTorch实现一个LeNet网络进行手写数字识别。 1. LeNet网络结构 LeNet网络是由Yann LeCun等人在1998年提出的,是一个经典的卷积神经网络。它主要用于手写数字识别,包含两个卷积层和三个全连接层。 LeNet网络的结构如下所示: 输入…

    PyTorch 2023年5月15日
    00
  • 参考《深度学习之PyTorch实战计算机视觉》PDF

    计算机视觉、自然语言处理和语音识别是目前深度学习领域很热门的三大应用方向。 计算机视觉学习,推荐阅读《深度学习之PyTorch实战计算机视觉》。学到人工智能的基础概念及Python 编程技能,掌握PyTorch 的使用方法,学到深度学习相关的理论知识,比如卷积神经网络、循环神经网络、自动编码器,等等。在掌握深度学习理论和编程技能之后,还会学到如何基于PyTo…

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