pytorch深度学习入门(14)之

编程入门 行业动态 更新时间:2024-10-14 20:26:56

pytorch<a href=https://www.elefans.com/category/jswz/34/1769690.html style=深度学习入门(14)之"/>

pytorch深度学习入门(14)之

概述

模型量化是一种将浮点计算转成低比特定点计算的技术,可以有效的降低模型计算强度、参数大小和内存消耗,但往往带来巨大的精度损失。

在计算机视觉、深度学习的语境下,模型特指卷积神经网络,用于提取图像/视频视觉特征。量化是指将信号的连续取值近似为有限多个离散值的过程。可理解成一种信息压缩的方法。在计算机系统上考虑这个概念,一般用“低比特”来表示。也有人称量化为“定点化”,但是严格来讲所表示的范围是缩小的。定点化特指scale为2的幂次的线性量化,是一种更加实用的量化方法。

模型量化是将浮点数替换成整数,并进行存储和计算的方法。举例来讲,模型量化可通过将32比特浮点数转换成8比特整数,大大减少模型存储空间(最高可达4倍);同时将浮点数运算替换成整数运算,能够加快模型的推理速度并降低计算内存。

在本文中,我们将应用最简单的量化形式( 动态量化)到基于 LSTM 的下一个单词预测模型,紧密遵循 PyTorch 示例中的单词语言模型。

# imports
import os
from io import open
import timeimport torch
import torch.nn as nn
import torch.nn.functional as F

1. 定义模型

在这里,我们遵循单词语言模型示例中的模型来定义 LSTM 模型架构 。

class LSTMModel(nn.Module):"""Container module with an encoder, a recurrent module, and a decoder."""def __init__(self, ntoken, ninp, nhid, nlayers, dropout=0.5):super(LSTMModel, self).__init__()self.drop = nn.Dropout(dropout)self.encoder = nn.Embedding(ntoken, ninp)self.rnn = nn.LSTM(ninp, nhid, nlayers, dropout=dropout)self.decoder = nn.Linear(nhid, ntoken)self.init_weights()self.nhid = nhidself.nlayers = nlayersdef init_weights(self):initrange = 0.1self.encoder.weight.data.uniform_(-initrange, initrange)self.decoder.bias.data.zero_()self.decoder.weight.data.uniform_(-initrange, initrange)def forward(self, input, hidden):emb = self.drop(self.encoder(input))output, hidden = self.rnn(emb, hidden)output = self.drop(output)decoded = self.decoder(output)return decoded, hiddendef init_hidden(self, bsz):weight = next(self.parameters())return (weight.new_zeros(self.nlayers, bsz, self.nhid),weight.new_zeros(self.nlayers, bsz, self.nhid))

2. 加载文本数据

接下来,我们将 Wikitext-2 数据集加载到语料库中,再次遵循 单词语言模型示例的预处理。

class Dictionary(object):def __init__(self):self.word2idx = {}self.idx2word = []def add_word(self, word):if word not in self.word2idx:self.idx2word.append(word)self.word2idx[word] = len(self.idx2word) - 1return self.word2idx[word]def __len__(self):return len(self.idx2word)class Corpus(object):def __init__(self, path):self.dictionary = Dictionary()self.train = self.tokenize(os.path.join(path, 'train.txt'))self.valid = self.tokenize(os.path.join(path, 'valid.txt'))self.test = self.tokenize(os.path.join(path, 'test.txt'))def tokenize(self, path):"""Tokenizes a text file."""assert os.path.exists(path)# Add words to the dictionarywith open(path, 'r', encoding="utf8") as f:for line in f:words = line.split() + ['<eos>']for word in words:self.dictionary.add_word(word)# Tokenize file contentwith open(path, 'r', encoding="utf8") as f:idss = []for line in f:words = line.split() + ['<eos>']ids = []for word in words:ids.append(self.dictionary.word2idx[word])idss.append(torch.tensor(ids).type(torch.int64))ids = torch.cat(idss)return idsmodel_data_filepath = 'data/'corpus = Corpus(model_data_filepath + 'wikitext-2')

3.加载预训练模型

这是关于动态量化的教程,动态量化是一种在模型训练后应用的量化技术。因此,我们只需将一些预训练的权重加载到该模型架构中即可;这些权重是通过使用单词语言模型示例中的默认设置进行五个时期的训练获得的。

ntokens = len(corpus.dictionary)model = LSTMModel(ntoken = ntokens,ninp = 512,nhid = 256,nlayers = 5,
)model.load_state_dict(torch.load(model_data_filepath +

更多推荐

pytorch深度学习入门(14)之

本文发布于:2024-03-05 20:04:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1713271.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:深度   入门   pytorch

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!