pytorch实现LSTM学习总结
第一次写csdn,可以通过这样的方式记录一下自己学习过程中遇到的问题。
学习目标:
- 学习语言模型,以及如何训练一个语言模型
- 学习torchtext的基本使用方法
构建 vocabulary
word to inde 和 index to word - 学习torch.nn的一些基本模型
Linear
RNN
LSTM
GRU(因为我觉得LSTM和GRU在代码方面如出一辙,所以只用了LSTM) - RNN的训练技巧
Gradient Clipping
5.如何保存和读取模型
代码如下:
导入库:
torchtext提供了LanguageModelingDataset这个class来帮助我们处理语言模型数据集
BPTTIterator可以连续地得到连贯的句子
import torchtext
from torchtext.vocab import Vectors
import torch
import numpy as np
import random
USE_CUDA = torch.cuda.is_available()
# 为了保证实验结果可以复现,把各种random seed固定在某一个值
random.seed(53113)
np.random.seed(53113)
torch.manual_seed(53113)
if USE_CUDA:
torch.cuda.manual_seed(53113)
BATCH_SIZE = 32#每个batch的包含的句子数
EMBEDDING_SIZE = 1000#嵌入层大小
HIDDEN_SIZE = 500#隐藏层数量,区别于EMBEDDING_SIZE
MAX_VOCAB_SIZE = 50000# 单词总数
使用 torchtext 来创建vocabulary, 然后把数据读成batch的格式:
#参考:https://pytorch.org/text/0.8.1/data.html?highlight=field#torchtext.data.Field
#Filed还有很多参数,具体看官方文档,这里参数lower是所有单词都是小写
TEXT = torchtext.data.Field(lower=True)
train, val, test = torchtext.datasets.LanguageModelingDataset.splits(path=".",
train="text8.train.txt",
validation="text8.dev.txt",
test="text8.test.txt", text_field=TEXT)
#构造train的vocab的对象
TEXT.build_vocab(train, max_size=MAX_VOCAB_SIZE)
VOCAB_SIZE = len(TEXT.vocab)
#迭代器返回模型所需要的处理后的数据。迭代器主要分为Iterator,BucketIterator,BPTTIterator三种。
#Iterator:标准迭代器
#BucketIterator:相比于标准迭代器,会将类似长度的样本当做一批来处理,
#因为在文本处理中经常会需要将每一批样本长度补齐为当前批中最长序列的长度,
#因此当样本长度差别较大时,使用BucketIerator可以带来填充效率的提高。
#除此之外,我们还可以在Field中通过fix_length参数来对样本进行截断补齐操作。
#BPTTIterator:基于BPTT(基于时间的反向传播算法)的迭代器,一般用于语言模型中。
#参考:https://blog.csdn.net/leo_95/article/details/87708267
#bptt_len: 反向传播往回传的长度,这里我暂时理解为一个样本有多少个单词传入模型
#repeat: 多个epoch是否重复迭代器
#shuffle:epoch之间是否打乱数据
#device:CPU/GPU
train_iter, val_iter, test_iter = torchtext.data.BPTTIterator.splits(
(train, val, test), batch_size=BATCH_SIZE, device=-1, bptt_len=50, repeat=False, shuffle=True)
print(VOCAB_SIZE)
out:50002
可以通过vocab.stoi和vocab.itos映射乘数字或者对应的字符
#stoi:把字符映射成数字
TEXT.vocab.stoi["apple"]
out:1259
#itos:把数字映射成字符
TEXT.vocab.itos[5]
out:‘one’
- 模型的输入是一串文字,模型的输出也是一串文字,他们之间相差一个位置,因为语言模型的目标是根据之前的单词预测下一个单词
#iter(obj) 从可迭代对象创建一个迭代器 .简单地说,迭代器是包含方法__next__的对象,可用于迭代一组值。
it = iter(train_iter)
batch = next(it)
# string.join(sequence) 将string与sequence中的所有字符串元素合并,并返回结果
print(" ".join([TEXT.vocab.itos[i] for i in batch.text[:,1].data]))
print