最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在pytorch中動態(tài)調(diào)整優(yōu)化器的學(xué)習(xí)率方式

 更新時(shí)間:2020年06月24日 10:07:53   作者:FesianXu  
這篇文章主要介紹了在pytorch中動態(tài)調(diào)整優(yōu)化器的學(xué)習(xí)率方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

在深度學(xué)習(xí)中,經(jīng)常需要?jiǎng)討B(tài)調(diào)整學(xué)習(xí)率,以達(dá)到更好地訓(xùn)練效果,本文紀(jì)錄在pytorch中的實(shí)現(xiàn)方法,其優(yōu)化器實(shí)例為SGD優(yōu)化器,其他如Adam優(yōu)化器同樣適用。

一般來說,在以SGD優(yōu)化器作為基本優(yōu)化器,然后根據(jù)epoch實(shí)現(xiàn)學(xué)習(xí)率指數(shù)下降,代碼如下:

step = [10,20,30,40]
base_lr = 1e-4
sgd_opt = torch.optim.SGD(model.parameters(), lr=base_lr, nesterov=True, momentum=0.9)
def adjust_lr(epoch):
 lr = base_lr * (0.1 ** np.sum(epoch >= np.array(step)))
 for params_group in sgd_opt.param_groups:
  params_group['lr'] = lr
 return lr

只需要在每個(gè)train的epoch之前使用這個(gè)函數(shù)即可。

for epoch in range(60):
 model.train()
 adjust_lr(epoch)
 for ind, each in enumerate(train_loader):
 mat, label = each
 ... 

補(bǔ)充知識:Pytorch框架下應(yīng)用Bi-LSTM實(shí)現(xiàn)汽車評論文本關(guān)鍵詞抽取

需要調(diào)用的模塊及整體Bi-lstm流程

import torch
import pandas as pd
import numpy as np
from tensorflow import keras
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import DataLoader
from torch.utils.data import TensorDataset
import gensim
from sklearn.model_selection import train_test_split
class word_extract(nn.Module):
 def __init__(self,d_model,embedding_matrix):
  super(word_extract, self).__init__()
  self.d_model=d_model
  self.embedding=nn.Embedding(num_embeddings=len(embedding_matrix),embedding_dim=200)
  self.embedding.weight.data.copy_(embedding_matrix)
  self.embedding.weight.requires_grad=False
  self.lstm1=nn.LSTM(input_size=200,hidden_size=50,bidirectional=True)
  self.lstm2=nn.LSTM(input_size=2*self.lstm1.hidden_size,hidden_size=50,bidirectional=True)
  self.linear=nn.Linear(2*self.lstm2.hidden_size,4)

 def forward(self,x):
  w_x=self.embedding(x)
  first_x,(first_h_x,first_c_x)=self.lstm1(w_x)
  second_x,(second_h_x,second_c_x)=self.lstm2(first_x)
  output_x=self.linear(second_x)
  return output_x

將文本轉(zhuǎn)換為數(shù)值形式

def trans_num(word2idx,text):
 text_list=[]
 for i in text:
  s=i.rstrip().replace('\r','').replace('\n','').split(' ')
  numtext=[word2idx[j] if j in word2idx.keys() else word2idx['_PAD'] for j in s ]
  text_list.append(numtext)
 return text_list

將Gensim里的詞向量模型轉(zhuǎn)為矩陣形式,后續(xù)導(dǎo)入到LSTM模型中

def establish_word2vec_matrix(model): #負(fù)責(zé)將數(shù)值索引轉(zhuǎn)為要輸入的數(shù)據(jù)
 word2idx = {"_PAD": 0} # 初始化 `[word : token]` 字典,后期 tokenize 語料庫就是用該詞典。
 num2idx = {0: "_PAD"}
 vocab_list = [(k, model.wv[k]) for k, v in model.wv.vocab.items()]

 # 存儲所有 word2vec 中所有向量的數(shù)組,留意其中多一位,詞向量全為 0, 用于 padding
 embeddings_matrix = np.zeros((len(model.wv.vocab.items()) + 1, model.vector_size))
 for i in range(len(vocab_list)):
  word = vocab_list[i][0]
  word2idx[word] = i + 1
  num2idx[i + 1] = word
  embeddings_matrix[i + 1] = vocab_list[i][1]
 embeddings_matrix = torch.Tensor(embeddings_matrix)
 return embeddings_matrix, word2idx, num2idx

訓(xùn)練過程

def train(model,epoch,learning_rate,batch_size,x, y, val_x, val_y):
 optimizor = optim.Adam(model.parameters(), lr=learning_rate)
 data = TensorDataset(x, y)
 data = DataLoader(data, batch_size=batch_size)
 for i in range(epoch):
  for j, (per_x, per_y) in enumerate(data):
   output_y = model(per_x)
   loss = F.cross_entropy(output_y.view(-1,output_y.size(2)), per_y.view(-1))
   optimizor.zero_grad()
   loss.backward()
   optimizor.step()
   arg_y=output_y.argmax(dim=2)
   fit_correct=(arg_y==per_y).sum()
   fit_acc=fit_correct.item()/(per_y.size(0)*per_y.size(1))
   print('##################################')
   print('第{}次迭代第{}批次的訓(xùn)練誤差為{}'.format(i + 1, j + 1, loss), end=' ')
   print('第{}次迭代第{}批次的訓(xùn)練準(zhǔn)確度為{}'.format(i + 1, j + 1, fit_acc))
   val_output_y = model(val_x)
   val_loss = F.cross_entropy(val_output_y.view(-1,val_output_y.size(2)), val_y.view(-1))
   arg_val_y=val_output_y.argmax(dim=2)
   val_correct=(arg_val_y==val_y).sum()
   val_acc=val_correct.item()/(val_y.size(0)*val_y.size(1))
   print('第{}次迭代第{}批次的預(yù)測誤差為{}'.format(i + 1, j + 1, val_loss), end=' ')
   print('第{}次迭代第{}批次的預(yù)測準(zhǔn)確度為{}'.format(i + 1, j + 1, val_acc))
 torch.save(model,'./extract_model.pkl')#保存模型

主函數(shù)部分

if __name__ =='__main__':
 #生成詞向量矩陣
 word2vec = gensim.models.Word2Vec.load('./word2vec_model')
 embedding_matrix,word2idx,num2idx=establish_word2vec_matrix(word2vec)#輸入的是詞向量模型
 #
 train_data=pd.read_csv('./數(shù)據(jù).csv')
 x=list(train_data['文本'])
 # 將文本從文字轉(zhuǎn)化為數(shù)值,這部分trans_num函數(shù)你需要自己改動去適應(yīng)你自己的數(shù)據(jù)集
 x=trans_num(word2idx,x)
 #x需要先進(jìn)行填充,也就是每個(gè)句子都是一樣長度,不夠長度的以0來填充,填充詞單獨(dú)分為一類
 # #也就是說輸入的x是固定長度的數(shù)值列表,例如[50,123,1850,21,199,0,0,...]
 #輸入的y是[2,0,1,0,0,1,3,3,3,3,3,.....]
 #填充代碼你自行編寫,以下部分是針對我的數(shù)據(jù)集
 x=keras.preprocessing.sequence.pad_sequences(
   x,maxlen=60,value=0,padding='post',
 )
 y=list(train_data['BIO數(shù)值'])
 y_text=[]
 for i in y:
  s=i.rstrip().split(' ')
  numtext=[int(j) for j in s]
  y_text.append(numtext)
 y=y_text
 y=keras.preprocessing.sequence.pad_sequences(
   y,maxlen=60,value=3,padding='post',
  )
 # 將數(shù)據(jù)進(jìn)行劃分
 fit_x,val_x,fit_y,val_y=train_test_split(x,y,train_size=0.8,test_size=0.2)
 fit_x=torch.LongTensor(fit_x)
 fit_y=torch.LongTensor(fit_y)
 val_x=torch.LongTensor(val_x)
 val_y=torch.LongTensor(val_y)
 #開始應(yīng)用
 w_extract=word_extract(d_model=200,embedding_matrix=embedding_matrix)
 train(model=w_extract,epoch=5,learning_rate=0.001,batch_size=50,
   x=fit_x,y=fit_y,val_x=val_x,val_y=val_y)#可以自行改動參數(shù),設(shè)置學(xué)習(xí)率,批次,和迭代次數(shù)
 w_extract=torch.load('./extract_model.pkl')#加載保存好的模型
 pred_val_y=w_extract(val_x).argmax(dim=2)



以上這篇在pytorch中動態(tài)調(diào)整優(yōu)化器的學(xué)習(xí)率方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 簡單談?wù)凱ython面向?qū)ο蟮南嚓P(guān)知識

    簡單談?wù)凱ython面向?qū)ο蟮南嚓P(guān)知識

    由于馬上就要期末考試了,正在抓緊時(shí)間復(fù)習(xí) 所以這一篇就拖了很久,抱歉啦~ 今天會說說: 屬性私有,方法私有,重寫,魔術(shù)方法,需要的朋友可以參考下
    2021-01-01
  • 對django中render()與render_to_response()的區(qū)別詳解

    對django中render()與render_to_response()的區(qū)別詳解

    今天小編就為大家分享一篇對django中render()與render_to_response()的區(qū)別詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • pycharm如何實(shí)現(xiàn)跨目錄調(diào)用文件

    pycharm如何實(shí)現(xiàn)跨目錄調(diào)用文件

    這篇文章主要介紹了pycharm如何實(shí)現(xiàn)跨目錄調(diào)用文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python jenkins 打包構(gòu)建代碼的示例代碼

    python jenkins 打包構(gòu)建代碼的示例代碼

    這篇文章主要介紹了python jenkins 打包構(gòu)建代碼的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Python遠(yuǎn)程控制Windows服務(wù)器的方法總結(jié)

    Python遠(yuǎn)程控制Windows服務(wù)器的方法總結(jié)

    在信息時(shí)代的洪流中,掌握一門編程語言已經(jīng)成為一項(xiàng)必備技能,Python,這門以簡潔、易學(xué)、強(qiáng)大著稱的編程語言,更是成為無數(shù)開發(fā)者的大寶劍,今天,我們要探討的就是如何用 Python 遠(yuǎn)程控制 Windows 服務(wù)器,需要的朋友可以參考下
    2024-07-07
  • Python異步執(zhí)行CMD命令的具體實(shí)現(xiàn)

    Python異步執(zhí)行CMD命令的具體實(shí)現(xiàn)

    異步執(zhí)行CMD命令是提高Python程序性能的有效方法,本文就來介紹一下Python異步執(zhí)行CMD命令的具體實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • 關(guān)于dataframe排序 pd.rank()

    關(guān)于dataframe排序 pd.rank()

    pandas.DataFrame.rank方法支持不同的排序方式,如按行或列、升序或降序等,主要參數(shù)包括axis控制按行或列排名,method定義相同值的處理方式,numeric_only指定是否僅對數(shù)字列排序,na_option設(shè)置NaN值的排序方法,ascending確定排序方向,pct決定是否以百分比形式展示排名
    2024-09-09
  • django列表篩選功能的實(shí)現(xiàn)代碼

    django列表篩選功能的實(shí)現(xiàn)代碼

    這篇文章主要介紹了django列表篩選功能的實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 基于Python編寫一個(gè)二維碼生成器

    基于Python編寫一個(gè)二維碼生成器

    二維碼又稱二維條碼,常見的二維碼為QR Code,QR全稱Quick Response,是一個(gè)近幾年來移動設(shè)備上超流行的一種編碼方式。本文將利用python生成一個(gè)簡單的二維碼生成器,需要的可以參考一下
    2022-06-06
  • 淺談Python大神都是這樣處理XML文件的

    淺談Python大神都是這樣處理XML文件的

    這篇文章主要介紹了詳解Python大神都是這樣處理XML文件的,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05

最新評論

临漳县| 辛集市| 西城区| 兴业县| 井陉县| 邢台市| 浦城县| 金华市| 柳州市| 花莲县| 滦南县| 宜兰县| 海兴县| 通道| 手游| 武川县| 肃南| 仪陇县| 武胜县| 茂名市| 峨眉山市| 布拖县| 恩施市| 江源县| 千阳县| 随州市| 平乡县| 石屏县| 德保县| 昌黎县| 札达县| 淮阳县| 河西区| 田东县| 惠安县| 平塘县| 辽宁省| 文昌市| 寻甸| 和田县| 青州市|