• pytorch中的词性标注_seq2seq_比较naive的示例


    一、各种用法_查漏补缺:
    1.关于numpy中的argmax的用法:

    numpy之argmax()函数 - 知乎 (zhihu.com)

    具体看这篇文章够了

    二、代码+注释:

    参考:

    Sequence Models and Long Short-Term Memory Networks — PyTorch Tutorials 2.0.1+cu117 documentation

    01 序列模型和基于LSTM的循环神经网络 - 知乎 (zhihu.com)

    1. #这么少的训练数据?
    2. training_data = [
    3. ("The dog ate the apple".split(), ["DET", "NN", "V", "DET", "NN"]),
    4. ("Everybody read that book".split(), ["NN", "V", "DET", "NN"])
    5. ]
    1. import torch
    2. import torch.autograd as autograd # torch中自动计算梯度模块
    3. import torch.nn as nn # 神经网络模块
    4. import torch.nn.functional as F # 神经网络模块中的常用功能
    5. import torch.optim as optim # 模型优化器模块
    6. torch.manual_seed(1)
    1. #构建一个单词到 索引index1的 字典 word_to_ix 和 词性到所有的自带你tag_to_ix
    2. word_to_ix = {} # 单词的索引字典
    3. for sent, tags in training_data:
    4. for word in sent:
    5. if word not in word_to_ix:
    6. word_to_ix[word] = len(word_to_ix)
    7. print(word_to_ix)
    8. tag_to_ix = {"DET": 0, "NN": 1, "V": 2} # 手工设定词性标签数据字典
    1. #设计这个RNN模型
    2. class LSTMTagger(nn.Module):
    3. def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size):#vocab_size:词的数量
    4. super(LSTMTagger, self).__init__()
    5. self.hidden_dim = hidden_dim
    6. self.word_embeddings = nn.Embedding(vocab_size, embedding_dim) #词汇表-vocab*embedding_dim维度
    7. self.lstm = nn.LSTM(embedding_dim, hidden_dim) #从embedding_dim -> hidden_dim的lstm
    8. self.hidden2tag = nn.Linear(hidden_dim, tagset_size) #从hidden_dim维度 -> tagset_size维度的linear层
    9. self.hidden = self.init_hidden() #自动调用init_hidden()
    10. def init_hidden(self): #自动调用h_0的初始化内容
    11. return (autograd.Variable(torch.zeros(1, 1, self.hidden_dim)),
    12. autograd.Variable(torch.zeros(1, 1, self.hidden_dim)))
    13. def forward(self, sentence): #运行过程
    14. embeds = self.word_embeddings(sentence) #sentence需要是一个 数字 组成的数组
    15. lstm_out, self.hidden = self.lstm(
    16. embeds.view(len(sentence), 1, -1), self.hidden) #将sentence数组转换为len*1*(自动)的3维空间 ->通过 lstm
    17. tag_space = self.hidden2tag(lstm_out.view(len(sentence), -1)) #在将lstm_out转换为2
    18. tag_scores = F.log_softmax(tag_space) #通过softmax
    19. return tag_scores #返回分数
    1. #将句子转换为 对应的 数值数组:
    2. def prepare_sequence(seq, to_ix):
    3. idxs = [to_ix[w] for w in seq] #将句子seq中的词汇转成数字index后 组成一个一维数组idxs
    4. tensor = torch.LongTensor(idxs)
    5. return autograd.Variable(tensor)
    1. #生成model对象, loss_Function,optimizer对象实体
    2. EMBEDDING_DIM = 6
    3. HIDDEN_DIM = 6
    4. model = LSTMTagger(EMBEDDING_DIM, HIDDEN_DIM, len(word_to_ix), len(tag_to_ix)) #模型对象
    5. loss_function = nn.NLLLoss() #loss_function
    6. optimizer = optim.SGD(model.parameters(), lr=0.1) #optimizer
    1. #一个小小的测试:
    2. inputs = prepare_sequence(training_data[0][0], word_to_ix) #得到数值 数组inputs
    3. tag_scores = model(inputs) #通过一个model得到的 tag_scores
    4. print(training_data[0][0])
    5. print(inputs)
    6. print(tag_scores)
    7. #用最大的数值对应的索引号去标签数据: “The dog ate the apple”
    8. #所以,这里预测的结果是 1 1 1 1 1 也就是名词 名词 名词 名词 名词 ,这个纯粹随机结果

    1. #正式的开始train
    2. for epoch in range(300): # 我们要训练300次,可以根据任务量的大小酌情修改次数。
    3. for sentence, tags in training_data:
    4. # 清除网络先前的梯度值,梯度值是Pytorch的变量才有的数据,Pytorch张量没有
    5. model.zero_grad()
    6. # 重新初始化隐藏层数据,避免受之前运行代码的干扰
    7. model.hidden = model.init_hidden()
    8. # 准备网络可以接受的的输入数据和真实标签数据,这是一个监督式学习
    9. sentence_in = prepare_sequence(sentence, word_to_ix)
    10. targets = prepare_sequence(tags, tag_to_ix) #targets数组也是转化为 数值 数组
    11. # 运行我们的模型,直接将模型名作为方法名看待即可
    12. tag_scores = model(sentence_in)
    13. # 计算损失,反向传递梯度及更新模型参数
    14. loss = loss_function(tag_scores, targets)
    15. loss.backward()
    16. optimizer.step()
    17. # 来检验下模型训练的结果
    18. inputs = prepare_sequence(training_data[0][0], word_to_ix)
    19. tag_scores = model(inputs)
    20. print(tag_scores)
    21. #利用numpy中的argmax找到每一行最大值的 索引值
    22. import numpy as np
    23. numpy_array = tag_scores.detach().numpy()
    24. np.argmax(numpy_array,axis=1)
    25. #用最大的数值对应的索引号去标签数据: “The dog ate the apple”
    26. #所以,这里预测的结果是 0 1 2 0 1 也就是冠词 名词 动词 冠词 名词 ,这个完全正确

  • 相关阅读:
    【LeetCode】Day130-最长有效括号
    莫队
    C#异步和多线程
    LoongArch 指令集实验exp6
    C#记录日志方法
    没有项目管理经验,可以参加PMP考试么?
    平时积累的FPGA知识点(7)
    .NET 8 中的 WPF File Dialog 改进
    调用链监控工具之CAT上
    【Godot4自学手册】第十八节主人公的血量显示
  • 原文地址:https://blog.csdn.net/xiao_ZHEDA/article/details/132815793