在pytorch中動態(tài)調(diào)整優(yōu)化器的學(xué)習(xí)率方式
在深度學(xué)習(xí)中,經(jīng)常需要動態(tài)調(diào)整學(xué)習(xí)率,以達(dá)到更好地訓(xùn)練效果,本文紀(jì)錄在pytorch中的實現(xiàn)方法,其優(yōu)化器實例為SGD優(yōu)化器,其他如Adam優(yōu)化器同樣適用。
一般來說,在以SGD優(yōu)化器作為基本優(yōu)化器,然后根據(jù)epoch實現(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
只需要在每個train的epoch之前使用這個函數(shù)即可。
for epoch in range(60): model.train() adjust_lr(epoch) for ind, each in enumerate(train_loader): mat, label = each ...
補充知識:Pytorch框架下應(yīng)用Bi-LSTM實現(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需要先進行填充,也就是每個句子都是一樣長度,不夠長度的以0來填充,填充詞單獨分為一類
# #也就是說輸入的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ù)進行劃分
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)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解pycharm連接遠(yuǎn)程linux服務(wù)器的虛擬環(huán)境的方法
這篇文章主要介紹了pycharm連接遠(yuǎn)程linux服務(wù)器的虛擬環(huán)境的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
Django admin管理工具TabularInline類用法詳解
這篇文章主要介紹了Django admin管理工具TabularInline類用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python根據(jù)站點列表繪制站坐標(biāo)全球分布圖的示例
這篇文章主要介紹了Python根據(jù)站點列表繪制站坐標(biāo)全球分布圖,輸入站點列表文件、snx全球站點坐標(biāo)文件,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12
python使用rabbitmq實現(xiàn)網(wǎng)絡(luò)爬蟲示例
這篇文章主要介紹了python使用RabbitMQ實現(xiàn)網(wǎng)絡(luò)爬蟲的示例,需要的朋友可以參考下2014-02-02

