當(dāng)前位置:
首頁 >
pytorch 笔记:手动实现AR (auto regressive)
發(fā)布時(shí)間:2025/4/5
32
豆豆
生活随笔
收集整理的這篇文章主要介紹了
pytorch 笔记:手动实现AR (auto regressive)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 導(dǎo)入庫& 數(shù)據(jù)說明
import numpy as np import torch import matplotlib.pyplot as plt from tensorboardX import SummaryWriterx=np.array([[ 1, 2],[ 3, 4],[ 5, 6],[ 7, 10],[ 13, 18],[ 23, 30],[ 37, 50],[ 63, 86],[109, 146],[183, 246]]) xx=torch.tensor(x,dtype=torch.float32,requires_grad=True) xx我們有這樣一組數(shù)據(jù)x,每一行代表一個(gè)時(shí)刻的二維數(shù)據(jù),我們希望的是
2 模型
pytorch筆記 pytorch模型中的parameter與buffer_UQI-LIUWJ的博客-CSDN博客
import torchclass Net(torch.nn.Module):def __init__(self,lag_list):super(Net,self).__init__()self.lag_list=lag_list#時(shí)滯集self.l=len(self.lag_list)#時(shí)滯集大小self.param=torch.nn.Parameter(torch.zeros(self.l,2))#自回歸系數(shù),一個(gè)time lag 一行自回歸系數(shù)#自回歸系數(shù)放入Parameter里面,那么也會(huì)隨著神經(jīng)網(wǎng)路梯度下降更新#定義前向傳播方式def forward(self,x):max_len=max(self.lag_list)#時(shí)滯集的最大元素,從這個(gè)元素之后的一個(gè)元素開始,考慮自回歸預(yù)測和本身的差距l(xiāng)=x.shape[0]if(type(l)==type(1)):passelse:l=int(l)#這里為什么要這么分類一下呢?其實(shí)這也是我的一個(gè)疑問。'''直接用pytorch的話,l是一個(gè)int類型的數(shù)字但是如果使用了tensorboardX之后,l是一個(gè)Tensor,那么就得用類型轉(zhuǎn)換回int'''tensor_len=l-max_len#表示需要進(jìn)行(自回歸預(yù)測-數(shù)據(jù)本身)比較的長度#也就是max_len后一位開始到最后的這一部分的長度lst_lag=[]#不同時(shí)滯集對(duì)應(yīng)的輸入數(shù)據(jù)的部分for i in self.lag_list:lst_lag.append(x[max_len-i:max_len-i+tensor_len].clone())#這里為什么要通過這種clone+放入列表的方式呢?#因?yàn)槿绻阒苯釉谠紨?shù)據(jù)上進(jìn)行切片操作【比如x[i]=x[i-1]+x[i-2]】這種#它會(huì)因?yàn)榍衅蚷nplace的問題,而無法傳遞梯度,最終會(huì)報(bào)錯(cuò)ret_tmp_origin=x[max_len:max_len+tensor_len].clone()#原始數(shù)據(jù)需要比較的一部分ret_var=self.param[0]*lst_lag[0]for i in range(1,self.l):ret_var=ret_var+self.param[i]*lst_lag[i]#自回歸預(yù)測的部分return(ret_var-ret_tmp_origin)#自回歸預(yù)測的部分和原始部分的差距3 模型訓(xùn)練& tensorboardX可視化
net=Net([3,1])from tensorboardX import SummaryWriterwriter = SummaryWriter('runs/AR_pytorch') #提供一個(gè)路徑,將使用該路徑來保存日志writer.add_graph(net,xx) #添加net的計(jì)算圖#使用Adams進(jìn)行梯度下降,設(shè)置學(xué)習(xí)率為0.02 optimizer=torch.optim.Adam(net.parameters(),lr=0.02)#開始訓(xùn)練 for epoch in range(1000):prediction=net(xx)loss=torch.linalg.norm(prediction)#每次損失函數(shù)都是自回歸預(yù)測和原始數(shù)據(jù)之間的L2范數(shù)writer.add_scalar('loss_',loss,epoch)#添加loss的summary信息optimizer.zero_grad()#清空上一步殘余的參數(shù)更新值loss.backward()#誤差反向傳播,計(jì)算參數(shù)更新值optimizer.step()#將參數(shù)更新值施加到net的parameters上for i in net.parameters():writer.add_scalar('param-0_time_lag-3',i[0][0].item(),epoch)writer.add_scalar('param-1_time_lag-3',i[0][1].item(),epoch)writer.add_scalar('param-0_time_lag-1',i[1][0].item(),epoch)writer.add_scalar('param-1_time_lag-1',i[1][1].item(),epoch)在tensorboardX上,有:
3.1 損失函數(shù)圖像
?3.2 自回歸系數(shù)圖像
可以看到,最后和我們目標(biāo)的[2,1]很接近了?
?3.3? TensorboardX 計(jì)算圖
整體如下,左邊是自回歸的計(jì)算路徑,右邊是原始數(shù)據(jù)(截取max_len之后的部分)的計(jì)算路徑
3.3.1 右側(cè)計(jì)算路徑
ret_tmp_origin=x[max_len:max_len+tensor_len].clone() #原始數(shù)據(jù)需要比較的一部分?
?3.3.2 左側(cè)計(jì)算路徑
左右路(下)? x[2:9] (X[t-1])
左左路(下)?? x[0:7] (X[t-3])
?左中路
?就是不同時(shí)滯對(duì)應(yīng)的切片*對(duì)應(yīng)的param值
最后這是一個(gè)減法,自回歸得到的和原始數(shù)據(jù)相減
4 使用Linear 進(jìn)行自回歸
1~3小節(jié)說的模型,可以想成是
?其中Cl是向量
現(xiàn)在我們按照機(jī)器學(xué)習(xí)筆記:向量自回歸模型VAR?中所說的那樣,認(rèn)為自回歸的內(nèi)容是矩陣(即Cl是矩陣)
4.1 重新構(gòu)造數(shù)據(jù)集
首先我們重新構(gòu)造數(shù)據(jù)集
import numpy as np import torch import matplotlib.pyplot as plt from tensorboardX import SummaryWriterx=np.array([[ 1, 2],[ 3, 4],[ 5, 6]])for i in range(7):tmp=np.array([[1,0],[2,1]])@x[2+i].T+np.array([[2,1],[3,1]])@x[0+i].Ttmp=tmp.reshape(1,-1)x=np.append(x,tmp,axis=0)x ''' array([[ 1, 2],[ 3, 4],[ 5, 6],[ 9, 21],[ 19, 52],[ 35, 111],[ 74, 229],[ 164, 486],[ 345, 1030],[ 722, 2171]]) ''' xx=torch.tensor(x,dtype=torch.float32,requires_grad=True)可以想象成,此時(shí)
4.2 模型稍作修改
把param的部分換成了 modlst,其他的基本上都不變
import torchclass Net(torch.nn.Module):def __init__(self,lag_list):super(Net,self).__init__()self.lag_list=lag_list#時(shí)滯集self.l=len(self.lag_list)#時(shí)滯集大小self.modlst=torch.nn.ModuleList([])for i in range(self.l):self.modlst.append(torch.nn.Linear(2,2,bias=False))#自回歸矩陣,一個(gè)time lag 一個(gè)自回歸矩陣#自回歸矩陣放入Parameter里面,那么也會(huì)隨著神經(jīng)網(wǎng)路梯度下降更新#定義前向傳播方式def forward(self,x):max_len=max(self.lag_list)#時(shí)滯集的最大元素,從這個(gè)元素之后的一個(gè)元素開始,考慮自回歸預(yù)測和本身的差距l(xiāng)=x.shape[0]if(type(l)==type(1)):passelse:l=int(l)#這里為什么要這么分類一下呢?其實(shí)這也是我的一個(gè)疑問。'''直接用pytorch的話,l是一個(gè)int類型的數(shù)字但是如果使用了tensorboardX之后,l是一個(gè)Tensor,那么就得用類型轉(zhuǎn)換回int'''tensor_len=l-max_len#表示需要進(jìn)行(自回歸預(yù)測-數(shù)據(jù)本身)比較的長度#也就是max_len后一位開始到最后的這一部分的長度lst_lag=[]#不同時(shí)滯集對(duì)應(yīng)的輸入數(shù)據(jù)的部分for i in self.lag_list:lst_lag.append(x[max_len-i:max_len-i+tensor_len].clone())#這里為什么要通過這種clone+放入列表的方式呢?#因?yàn)槿绻阒苯釉谠紨?shù)據(jù)上進(jìn)行切片操作【比如x[i]=x[i-1]+x[i-2]】這種#它會(huì)因?yàn)榍衅蚷nplace的問題,而無法傳遞梯度,最終會(huì)報(bào)錯(cuò)ret_tmp_origin=x[max_len:max_len+tensor_len].clone()#原始數(shù)據(jù)需要比較的一部分ret_var=self.modlst[0](lst_lag[0])for i in range(1,self.l):ret_var=ret_var+self.modlst[i](lst_lag[i])#自回歸預(yù)測的部分return(ret_var-ret_tmp_origin)#自回歸預(yù)測的部分和原始部分的差距4.3 訓(xùn)練模型?
訓(xùn)練的時(shí)候也和之前的類似
net=Net([3,1])from tensorboardX import SummaryWriterwriter = SummaryWriter('runs/AR_fc_1_pytorch') #提供一個(gè)路徑,將使用該路徑來保存日志writer.add_graph(net,xx) #添加net的計(jì)算圖#使用Adams進(jìn)行梯度下降,設(shè)置學(xué)習(xí)率為0.02 optimizer=torch.optim.Adam(net.parameters(),lr=0.02)#開始訓(xùn)練 for epoch in range(10000):prediction=net(xx)loss=torch.linalg.norm(prediction)#每次損失函數(shù)都是自回歸預(yù)測和原始數(shù)據(jù)之間的L2范數(shù)if(epoch>=200):writer.add_scalar('loss_',loss,epoch)#添加loss的summary信息optimizer.zero_grad()#清空上一步殘余的參數(shù)更新值loss.backward()#誤差反向傳播,計(jì)算參數(shù)更新值optimizer.step()#將參數(shù)更新值施加到net的parameters上'''for i in net.parameters():writer.add_scalar('param-0_time_lag-3',i[0][0].item(),epoch)writer.add_scalar('param-1_time_lag-3',i[0][1].item(),epoch)writer.add_scalar('param-0_time_lag-1',i[1][0].item(),epoch)writer.add_scalar('param-1_time_lag-1',i[1][1].item(),epoch)'''if(epoch % 100==0):for i in net.parameters():print(i)''' 最后一次輸出的參數(shù)為: Parameter containing: tensor([[1.9996, 0.9999],[3.0016, 1.0017]], requires_grad=True) Parameter containing: tensor([[9.9960e-01, 2.0738e-04],[2.0016e+00, 1.0019e+00]], requires_grad=True) 已經(jīng)很接近我們?cè)O(shè)置數(shù)據(jù)集時(shí)候的自回歸矩陣了 '''總結(jié)
以上是生活随笔為你收集整理的pytorch 笔记:手动实现AR (auto regressive)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实况教练属性分析
- 下一篇: 错误处理:Syntax error: B