pytorch实现LSTM学习总结

pytorch实现LSTM学习总结

第一次写csdn,可以通过这样的方式记录一下自己学习过程中遇到的问题。

学习目标:

  1. 学习语言模型,以及如何训练一个语言模型
  2. 学习torchtext的基本使用方法
    构建 vocabulary
    word to inde 和 index to word
  3. 学习torch.nn的一些基本模型
    Linear
    RNN
    LSTM
    GRU(因为我觉得LSTM和GRU在代码方面如出一辙,所以只用了LSTM)
  4. 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
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值