pytorch学习1.0系列 您所在的位置:网站首页 后缀为bin的文件是什么 pytorch学习1.0系列

pytorch学习1.0系列

2023-09-12 11:03| 来源: 网络整理| 查看: 265

文章目录 1. pytorch 的 Tensor保存和加载2. 保存和提取神经网络2.1 只保存和加载模型参数(推荐使用,但需要重新模型结构)2.2 保存和加载整个模型2.3模型后缀 3.保存-读取模型实例----->语言模型(预测一句话的下一个单词)3.1 代码3.1.1数据准备3.1.2定义模型3.1.3 训练模型+保存模型3.1.4 加载训练好的模型: 4.参考

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的基本使用方法 构建 vocabularyword to inde 和 index to word 学习torch.nn的一些基本模型 LinearRNNLSTMGRU 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" if EXIST_CUDA else "cpu") train_iter,val_iter,test_iter=torchtext.data.BPTTIterator.splits( (train,val,test), batch_size=BATCH_SIZE, device=device, bptt_len=50, repeat=False, shuffle=True ) 3.1.2定义模型 继承nn.Module初始化函数forward函数其余可以根据模型需要定义相关的函数

模型的输入是一串文字,模型的输出也是一串文字,他们之间相差一个位置,因为语言模型的目标是根据之前的单词预测下一个单词。

import torch.nn as nn class RNNModel(nn.Module): def __init__(self,vocab_size,embed_size,hidden_size): super(RNNModel,self).__init__() self.embed=nn.Embedding(vocab_size,embed_size) self.lstm=nn.LSTM(embed_size,hidden_size) self.linear=nn.Linear(hidden_size,vocab_size) self.hidden_size=hidden_size def forward(self,text,hidden): #forward pass # the shape of text:seq_length * batch_size emb=self.embed(text)#seq_length * batch_size * embed_size output,hidden=self.lstm(emb,hidden) out_vocab=self.linear(output.view(-1,output.shape[2])) out_vocab=out_vocab.view(output.size(0),output.size(1),out_vocab.size(-1)) return out_vocab,hidden def init_hidden(self,bsz,requires_grad=True): weight=next(self.parameters()) return (weight.new_zeros((1,bsz,self.hidden_size),requires_grad=True), weight.new_zeros((1,bsz,self.hidden_size),requires_grad=True)) #初始化模型 model=RNNModel(vocab_size=len(TEXT.vocab),embed_size=EMBEDDING_SIZE,hidden_size=100) if EXIST_CUDA: model=model.to(device) loss_fn=nn.CrossEntropyLoss() learning_rate=0.001 optimizer=torch.optim.Adam(model.parameters(),lr=learning_rate) NUM_EPOCHS=1 # 全部训练数据训练的轮次 VOCAB_SIZE=len(TEXT.vocab) GRAD_CLIP=5.0 scheduler=torch.optim.lr_scheduler.ExponentialLR(optimizer,0.5) val_losses=[10] 我们首先定义评估模型的代码。模型的评估和模型的训练逻辑基本相同,唯一的区别是我们只需要forward pass,不需要backward pass #评估 def evaluate(model,data): model.eval() it=iter(data) total_loss=0. total_count=0. with torch.no_grad(): hidden=model.init_hidden(BATCH_SIZE,requires_grad=False) for i,batch in enumerate(it): data,target=batch.text,batch.target hidden=repackage_hidden(hidden) output,hidden=model(data,hidden) loss=loss_fn(output.view(-1,VOCAB_SIZE),target.view(-1)) total_loss+=loss.item()*np.multiply(*data.size()) total_count+=np.multiply(*data.size()) loss=total_loss/total_count model.train() return loss #我们需要定义下面的一个function,帮助我们把一个hidden state和计算图之前的历史分离 def repackage_hidden(h): if isinstance(h,torch.Tensor): return h.detach() else: return tuple(repackage_hidden(v) for v in h) 3.1.3 训练模型+保存模型 模型一般需要训练若干个epoch每个epoch我们都把所有的数据分成若干个batch把每个batch的输入和输出都包装成cuda tensorforward pass,通过输入的句子预测每个单词的下一个单词用模型的预测和正确的下一个单词计算cross entropy loss清空模型当前gradientbackward passgradient clipping,防止梯度爆炸更新模型参数每隔一定的iteration输出模型在当前iteration的loss,以及在验证集上做模型的评估 for epoch in range(NUM_EPOCHS): model.train() it=iter(train_iter) hidden=model.init_hidden(BATCH_SIZE) for i,batch in enumerate(it): data,target=batch.text,batch.target hidden=repackage_hidden(hidden) output,hidden=model(data,hidden) loss=loss_fn(output.view(-1,VOCAB_SIZE),target.view(-1)) optimizer.zero_grad() loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(),GRAD_CLIP)#防止梯度爆炸 optimizer.step() if i%100==0: print(i," loss:",loss.item()) #每1900次判断下验证集的loss,如果比之前最小的还要小的话,保存这个模型的参数 if i%1900==0: val_loss=evaluate(model,val_iter)#是用验证集获得当前模型下的loss if val_loss


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有