语言模型笔记

# Some part of the code was referenced from below.
# https://github.com/pytorch/examples/tree/master/word_language_model
import torch
import torch.nn as nn
import numpy as np
from torch.nn.utils import clip_grad_norm_
from data_utils import Dictionary, Corpus
# Device configuration
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# Hyper-parameters
embed_size = 128   #一个单词最多多长
hidden_size = 1024
num_layers = 1
num_epochs = 5
num_samples = 1000 # number of words to be sampled
batch_size = 20
seq_length = 30
learning_rate = 0.002
# Load "Penn Treebank" dataset
corpus = Corpus()
ids = corpus.get_data('data/train.txt', batch_size)
vocab_size = len(corpus.dictionary) #一共有多少个单词
num_batches = ids.size(1) // seq_length
# RNN based language model
class RNNLM(nn.Module):
def __init__(self, vocab_size, embed_size, hidden_size, num_layers):
super(RNNLM, self).__init__()
self.embed = nn.Embedding(vocab_size, embed_size)#这个讲得最清楚【pytorch】有关nn.EMBEDDING的简单介绍_安安爸Chris的博客-CSDN博客
self.lstm = nn.LSTM(embed_size, hidden_size, num_layers, batch_first=True)
self.linear = nn.Linear(hidden_size, vocab_size)
def forward(self, x, h):
# Embed word ids to vectors
x = self.embed(x)
# Forward propagate LSTM
out, (h, c) = self.lstm(x, h)
# Reshape output to (batch_size*sequence_length, hidden_size)
out = out.reshape(out.size(0)*out.size(1), out.size(2))
# Decode hidden states of all time steps
out = self.linear(out)
return out, (h, c)
model = RNNLM(vocab_size, embed_size, hidden_size, num_layers).to(device)
# Loss and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
# Truncated backpropagation
def detach(states):
return [state.detach() for state in states]
# Train the model
for epoch in range(num_epochs):
# Set initial hidden and cell states
states = (torch.zeros(num_layers, batch_size, hidden_size).to(device),
torch.zeros(num_layers, batch_size, hidden_size).to(device))
for i in range(0, ids.size(1) - seq_length, seq_length):
# Get mini-batch inputs and targets
inputs = ids[:, i:i+seq_length].to(device)
targets = ids[:, (i+1):(i+1)+seq_length].to(device)#为什么全部加1,因为在语言预测中。下一个单词就是预测目标
# Forward pass
states = detach(states)
outputs, states = model(inputs, states)
loss = criterion(outputs, targets.reshape(-1))
# Backward and optimize
optimizer.zero_grad()
loss.backward()
clip_grad_norm_(model.parameters(), 0.5)
optimizer.step()
step = (i+1) // seq_length
if step % 100 == 0:
print ('Epoch [{}/{}], Step[{}/{}], Loss: {:.4f}, Perplexity: {:5.2f}'
.format(epoch+1, num_epochs, step, num_batches, loss.item(), np.exp(loss.item())))
# Test the model
with torch.no_grad():
with open('sample.txt', 'w') as f:
# Set intial hidden ane cell states
state = (torch.zeros(num_layers, 1, hidden_size).to(device),
torch.zeros(num_layers, 1, hidden_size).to(device))
# Select one word id randomly
prob = torch.ones(vocab_size)
input = torch.multinomial(prob, num_samples=1).unsqueeze(1).to(device)#返回的下标,所以随便设置了个全1数组?
for i in range(num_samples):
# Forward propagate RNN
output, state = model(input, state)
# Sample a word id
prob = output.exp()
word_id = torch.multinomial(prob, num_samples=1).item()
# Fill input with sampled word id for the next time step
input.fill_(word_id)
# File write
word = corpus.dictionary.idx2word[word_id]
word = '\n' if word == '<eos>' else word + ' '
f.write(word)
if (i+1) % 100 == 0:
print('Sampled [{}/{}] words and save to {}'.format(i+1, num_samples, 'sample.txt'))
# Save the model checkpoints

torch.save(model.state_dict(), 'model.ckpt')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 韩顺平老师的《Go语言入门经典》是一门循序渐进、易于理解并且知识点全面的Go语言课程。韩老师首先介绍了Go语言的基础语法和数据类型,然后讲解了函数、数组、切片、映射、结构体、接口等重要的语言特性。在这个过程中,韩老师配合了许多的代码实例,能够帮助学员更好的理解语言特性并进行实践。 除了基础语法之外,韩老师还关注了Go语言的并发编程。他讲解了协程和通道等并发编程基础,同时介绍了常见的并发编程模型和技术。这能够帮助学员更好的理解并发编程的思想,为编写高性能代码提供切实可行的思路。 总之,《Go语言入门经典》是一门循序渐进、深入浅出、知识点全面的Go语言课程,能够帮助学员轻松掌握Go语言的使用和实践,从而更好的完成各种应用开发。 ### 回答2: 韩顺平的Go语言课程笔记对于想要学习这门语言的人来说非常有价值。笔记涵盖了Go语言的基础知识和进阶内容,如语言特性、语法、并发、网络编程等。笔记结构清晰,详细解释了各个主题的概念和实践,搭建了一个良好的学习框架。此外,韩顺平还附加了代码示例和练习题,让学习者能够更深入地理解和掌握知识。 与其他教材相比,韩顺平的笔记注重实践和应用,更加贴近实际开发工作。他的课程概念清晰,难点也有深入浅出的讲解,同时还提供了大量实践案例,让学生能够更深入理解不同场景下的使用方法。 总体来说,韩顺平Go语言课程笔记是一份非常实用和详细的教程,不仅适合新手学习,也适合有一定经验的开发者提高自己的Go技能。对于想要学习这门语言的开发者来说,这份笔记是一个非常好的资源,能够帮助他们快速掌握Go语言的知识和技能。 ### 回答3: 韩顺平先生是国内知名程序员,他在教学领域也非常有影响力。他所编写的《Go语言入门教程》一书,旨在帮助初学者更快更好地掌握Go语言。除此之外,他还出版了一系列和计算机相关的著作,如《Python编程快速上手——让繁琐工作自动化》、《MySQL数据库入门与实战》等。这些书籍均得到了广泛的认可和好评。 在《Go语言入门教程》中,韩顺平先生非常注重实践和实例演示。他以浅显易懂的语言,详细地讲解了Go语言的基础知识、语法规则和应用场景,并提供了大量的案例和实战练习,让读者能够逐步掌握语言的精髓和应用技巧。 此外,韩顺平还为学习者提供了一系列优秀的学习资源,包括视频教程、笔记、课件等,使得学生可以根据自己的需要和进度进行学习。在他的Go课程笔记中,不仅详细记录了教学内容,还附带了大量的实例代码和解析,有助于学生更好地掌握课程内容。 总之,韩顺平先生的《Go语言入门教程》是一本非常有价值的入门教材,对于想要学习Go语言的程序员和开发者来说,都是一本必备的参考书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值