文章目录
1. pytorch 的 Tensor保存和加载
保存和提取主要使用torch.save和torch.load方法实现保存和提取
import torch
test_data = torch.FloatTensor(2,3)
# 保存数据
torch.save(test_data, "test_data.pkl")
print test_data
# 提取数据
print torch.load("test_data.pkl")
2. 保存和提取神经网络
2.1 只保存和加载模型参数(推荐使用,但需要重新模型结构)
# 保存
torch.save(the_model.state_dict(), PATH)
# 提取
# 需要先重新模型结构
the_model = TheModelClass(*args, **kwargs)
# 再加载参数
the_model.load_state_dict(torch.load(PATH))
2.2 保存和加载整个模型
如下会保存整个网络,如果数据量比较大,会消耗大量时间。占用的内存也比较高,所以不推荐使用
# 保存
torch.save(the_model, PATH)
# 提取
the_model = torch.load(PATH)
2.3模型后缀
在保存模型时,会看到有的保存为***.pt,有的是***.pth,有的是***.pkl
这几种模型文件效果上没什么不同,只是后缀不一样而已!
3.保存-读取模型实例----->语言模型(预测一句话的下一个单词)
学习目标
- 学习语言模型,以及如何训练一个语言模型
- 学习torchtext的基本使用方法
- 构建 vocabulary
- word to inde 和 index to word
- 学习torch.nn的一些基本模型
- Linear
- RNN
- LSTM
- GRU
- RNN的训练技巧
- Gradient Clipping
- 如何保存和读取模型
3.1 代码
3.1.1数据准备
我们会使用 torchtext 来创建vocabulary, 然后把数据读成batch的格式。请大家自行阅读README来学习torchtext。
import torchtext
from torchtext.vocab import Vectors
import torch
import numpy as np
import random
#cuda是否可用
EXIST_CUDA=torch.cuda.is_available()
#为了保证结果可以复现,经常把random seed固定为一个值
random.seed(1)
np.random.seed(1)
torch.manual_seed(1)
if EXIST_CUDA:
torch.cuda.manual_seed(1)
BATCH_SIZE=32 # 一个batch里有32个句子
EMBEDDING_SIZE=100 #把一个单词embedding为100维
MAX_VOCAB_SIZE=50000 #高频词表最大容量
- 我们会继续使用上次的text8作为我们的训练,验证和测试数据
- torchtext提供了LanguageModelingDataset这个class来帮助我们处理语言模型数据集
- BPTTIterator可以连续地得到连贯的句子
TEXT=torchtext.data.Field(lower=True)
#创建数据集
train,val,test=torchtext.datasets.LanguageModelingDataset.splits(
path="datas/3/text8/",
train="text8.train.txt",
validation="text8.dev.txt",
test="text8.test.txt",
text_field=TEXT
)
#创建高频词表
TEXT.build_vocab(train,max_size=MAX_VOCAB_SIZE)
#构建每一个batch,上面定义一个batch有32条句子
device=torch.device("cuda"