pytorch+lstm实现的pos示例
作者:say_c_box 时间:2023-08-11 22:02:10
学了几天终于大概明白pytorch怎么用了
这个是直接搬运的官方文档的代码
之后会自己试着实现其他nlp的任务
# Author: Robert Guthrie
import torch
import torch.autograd as autograd
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)
lstm = nn.LSTM(3, 3) # Input dim is 3, output dim is 3
inputs = [autograd.Variable(torch.randn((1, 3)))
for _ in range(5)] # make a sequence of length 5
# initialize the hidden state.
hidden = (autograd.Variable(torch.randn(1, 1, 3)),
autograd.Variable(torch.randn((1, 1, 3))))
for i in inputs:
# Step through the sequence one element at a time.
# after each step, hidden contains the hidden state.
out, hidden = lstm(i.view(1, 1, -1), hidden)
# alternatively, we can do the entire sequence all at once.
# the first value returned by LSTM is all of the hidden states throughout
# the sequence. the second is just the most recent hidden state
# (compare the last slice of "out" with "hidden" below, they are the same)
# The reason for this is that:
# "out" will give you access to all hidden states in the sequence
# "hidden" will allow you to continue the sequence and backpropagate,
# by passing it as an argument to the lstm at a later time
# Add the extra 2nd dimension
inputs = torch.cat(inputs).view(len(inputs), 1, -1)
hidden = (autograd.Variable(torch.randn(1, 1, 3)), autograd.Variable(
torch.randn((1, 1, 3)))) # clean out hidden state
out, hidden = lstm(inputs, hidden)
#print(out)
#print(hidden)
#准备数据
def prepare_sequence(seq, to_ix):
idxs = [to_ix[w] for w in seq]
tensor = torch.LongTensor(idxs)
return autograd.Variable(tensor)
training_data = [
("The dog ate the apple".split(), ["DET", "NN", "V", "DET", "NN"]),
("Everybody read that book".split(), ["NN", "V", "DET", "NN"])
]
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)
print(word_to_ix)
tag_to_ix = {"DET": 0, "NN": 1, "V": 2}
# These will usually be more like 32 or 64 dimensional.
# We will keep them small, so we can see how the weights change as we train.
EMBEDDING_DIM = 6
HIDDEN_DIM = 6
#继承自nn.module
class LSTMTagger(nn.Module):
def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size):
super(LSTMTagger, self).__init__()
self.hidden_dim = hidden_dim
#一个单词数量到embedding维数的矩阵
self.word_embeddings = nn.Embedding(vocab_size, embedding_dim)
#传入两个维度参数
# The LSTM takes word embeddings as inputs, and outputs hidden states
# with dimensionality hidden_dim.
self.lstm = nn.LSTM(embedding_dim, hidden_dim)
#线性layer从隐藏状态空间映射到tag便签
# The linear layer that maps from hidden state space to tag space
self.hidden2tag = nn.Linear(hidden_dim, tagset_size)
self.hidden = self.init_hidden()
def init_hidden(self):
# Before we've done anything, we dont have any hidden state.
# Refer to the Pytorch documentation to see exactly
# why they have this dimensionality.
# The axes semantics are (num_layers, minibatch_size, hidden_dim)
return (autograd.Variable(torch.zeros(1, 1, self.hidden_dim)),
autograd.Variable(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 = F.log_softmax(tag_space)
return tag_scores
#embedding维度,hidden维度,词语数量,标签数量
model = LSTMTagger(EMBEDDING_DIM, HIDDEN_DIM, len(word_to_ix), len(tag_to_ix))
#optim中存了各种优化算法
loss_function = nn.NLLLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)
# See what the scores are before training
# Note that element i,j of the output is the score for tag j for word i.
inputs = prepare_sequence(training_data[0][0], word_to_ix)
tag_scores = model(inputs)
print(tag_scores)
for epoch in range(300): # again, normally you would NOT do 300 epochs, it is toy data
for sentence, tags in training_data:
# Step 1. Remember that Pytorch accumulates gradients.
# We need to clear them out before each instance
model.zero_grad()
# Also, we need to clear out the hidden state of the LSTM,
# detaching it from its history on the last instance.
model.hidden = model.init_hidden()
# Step 2. Get our inputs ready for the network, that is, turn them into
# Variables of word indices.
sentence_in = prepare_sequence(sentence, word_to_ix)
targets = prepare_sequence(tags, tag_to_ix)
# Step 3. Run our forward pass.
tag_scores = model(sentence_in)
# Step 4. Compute the loss, gradients, and update the parameters by
# calling optimizer.step()
loss = loss_function(tag_scores, targets)
loss.backward()
optimizer.step()
# See what the scores are after training
inputs = prepare_sequence(training_data[0][0], word_to_ix)
tag_scores = model(inputs)
# The sentence is "the dog ate the apple". i,j corresponds to score for tag j
# for word i. The predicted tag is the maximum scoring tag.
# Here, we can see the predicted sequence below is 0 1 2 0 1
# since 0 is index of the maximum value of row 1,
# 1 is the index of maximum value of row 2, etc.
# Which is DET NOUN VERB DET NOUN, the correct sequence!
print(tag_scores)
来源:https://blog.csdn.net/say_c_box/article/details/78802770
标签:pytorch,lstm,pos
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python实现将16进制字符串转化为ascii字符的方法分析
2023-11-17 12:26:25
Oracle 11.2.0.4打补丁的方法
2024-01-13 08:01:26
![](https://img.aspxhome.com/file/2023/1/64471_0s.png)
Linux下修改MySQL数据库数据文件路径的步骤
2024-01-19 13:53:41
详解go-admin在线开发平台学习(安装、配置、启动)
2023-08-26 15:27:31
![](https://img.aspxhome.com/file/2023/9/101049_0s.png)
MySQL该如何判断不为空详析
2024-01-22 03:10:31
![](https://img.aspxhome.com/file/2023/3/80153_0s.png)
Matplotlib 生成不同大小的subplots实例
2022-12-22 03:16:26
![](https://img.aspxhome.com/file/2023/0/134920_0s.jpg)
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2024-05-03 15:52:31
浅谈如何提高PHP代码的质量
2024-06-05 09:47:05
django数据库迁移migration实现
2024-01-12 19:29:43
![](https://img.aspxhome.com/file/2023/5/127155_0s.png)
关于JavaScript数组去重的一些理解汇总
2024-05-02 16:17:56
![](https://img.aspxhome.com/file/2023/7/132707_0s.png)
SQL Server 常用函数使用方法小结
2024-01-13 11:39:32
MySQL开启慢查询日志功能的方法
2024-01-19 10:09:37
Python真题案例之蛇形数组详解
2021-12-09 11:00:40
![](https://img.aspxhome.com/file/2023/2/126892_0s.png)
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2023-06-26 14:19:03
![](https://img.aspxhome.com/file/2023/4/115874_0s.jpg)
运行tensorflow python程序,限制对GPU和CPU的占用操作
2022-07-03 02:49:26
Python Serial串口基本操作(收发数据)
2022-04-17 09:54:07
![](https://img.aspxhome.com/file/2023/7/117417_0s.png)
判断Threading.start新线程是否执行完毕的实例
2023-06-18 16:43:25
![](https://img.aspxhome.com/file/2023/3/68383_0s.jpg)
在.NetCore(C#)中使用ODP.NET Core+Dapper操作Oracle数据库
2024-01-26 05:33:06
python编写微信远程控制电脑的程序
2023-08-15 17:04:38
![](https://img.aspxhome.com/file/2023/1/131161_0s.png)
vue使用el-upload上传文件及Feign服务间传递文件的方法
2024-04-28 10:54:45