pytorch线性模型的基础使用
1.使用pytorch寫神經(jīng)網(wǎng)絡(luò)的第一步就是先構(gòu)建一個數(shù)據(jù)集。
numpy的廣播機(jī)制
我們使用一個簡單的模型y=wx+b來進(jìn)行理解。我們可以注意到在我們實(shí)際的應(yīng)用當(dāng)中xy將分別存在很多組,也就是說上面式子當(dāng)中的y和x是一個向量,但是b實(shí)際上應(yīng)該是一個數(shù)字b其實(shí)在實(shí)際操作中b會被numpy廣播成為一個[b,b,b,b,b,…,b]所需維度的列向量。這樣就可以順利加和了。其實(shí)是自動擴(kuò)充成前面矩陣相同大小的矩陣。大約可以參考下面的示意圖:
所有的數(shù)據(jù)集都是一個矩陣的問題
另外我們在使用線性模型的過程當(dāng)中,我們不是將這個yx想象成一個向量,我們必須將其當(dāng)成一個矩陣,其是一個3*1的矩陣,如下所示:
這樣的認(rèn)識又有什么不同呢?這就意味著我們在定義數(shù)據(jù)集的時候需要將其定義為一個矩陣而不是一個向量,具體如下圖所示:
2.接下來就是設(shè)定一個模型
線性模型
接下來一個問題就是線性模型的問題,我們這里先用最簡單的模型來實(shí)驗(yàn)一下。
我們分析這個線性模型需要知道什么?其實(shí)只要知道這個變換矩陣的行數(shù)和列數(shù)就行,也就是只要知道輸入和輸出的維數(shù)就行了。
損失函數(shù)必須是一個標(biāo)量,如果是一個向量那么就沒法算梯度了。
模型一般是構(gòu)造成一個類,并且這個類一定是要繼承自nn.Module。因?yàn)槠渲泻芏喾椒ㄊ俏覀兾磥硇枰褂玫降摹?/p>
w轉(zhuǎn)置的來源
我們在使用模型的過程當(dāng)中,我們一般是認(rèn)為每一行是一個數(shù)據(jù)的幾個維度的輸入讓后有多少行就是數(shù)據(jù)的個數(shù),但是在實(shí)際計算的過程中,是要對數(shù)據(jù)矩陣進(jìn)行轉(zhuǎn)置的,也就是每一列是數(shù)據(jù)的維度,然后列是數(shù)據(jù)的個數(shù)。
這樣子對于我們正常理解的行是數(shù)據(jù)輸入的維度,列是數(shù)據(jù)的個數(shù)的情況。w其實(shí)是后乘,如果變成我們習(xí)慣的前乘,那么實(shí)際上是一個轉(zhuǎn)置的w。這就是很多書上中寫的是w轉(zhuǎn)置的原因。
但是不管是使用哪一個,其實(shí)目的是一樣的。
下面展示模型定義的代碼片
class LinearModule (torch.nn.Module):def __init__(self):super(LinearModule,self).__init__()#第一個是類的名稱,第二個參數(shù)是self這是固定的調(diào)用父類的初始函數(shù)self.linear = torch.nn.Linear(1,1)#這里其實(shí)就實(shí)現(xiàn)了一個權(quán)重。這里實(shí)際上w和b都一下子實(shí)現(xiàn)了#參數(shù)是輸入樣本的維度、輸出樣本的維度:這是用來產(chǎn)生一個參數(shù)矩陣。第三個是一個bool量,默認(rèn)是true是是否使用偏置量的問題、'''這里的其實(shí)是重寫了一個函數(shù),將1原來的函數(shù)覆蓋了self.linear也就是一個來自于Linear的實(shí)例是一個可以調(diào)用的實(shí)例。Module當(dāng)中的可調(diào)用韓式是要調(diào)用這個forward的,所以我們一定要定義這個'''def forward(self,x):y_pred = self.linear(x)return(y_pred) ''' 這里我們注意一個點(diǎn)Module是不需要自行定義一個反向傳播函數(shù)的。 只要你是使用本身就有的庫在進(jìn)行模型實(shí)現(xiàn)的話。 Functions也是pytorch當(dāng)中的一個類,一個特殊的地方就是,你是否需要自行構(gòu)造一個反向傳播的函數(shù) 如果你需要自行定義一個反向傳播的函數(shù),1.pytorch不會算的2.pytorch自動生成的效率低的。 才需要使用到Function ''' module= LinearModule();3.構(gòu)造損失函數(shù)和優(yōu)化器,主要體現(xiàn)使用應(yīng)用接口來實(shí)現(xiàn)
criterion = torch.nn.MSELoss(size_average=False) #這里其實(shí)是實(shí)例化一個損失函數(shù),這個MSELoss其實(shí)也是繼承自nn.Module #這里面一共兩個參數(shù)第一個是是否計算平均值,計算平均值一般用在各組數(shù)據(jù)量不同的時候 #第二個參數(shù)是是否轉(zhuǎn)化為標(biāo)量,兩個參數(shù)都是默認(rèn)TRUE的但是一般用不到求平均,設(shè)置為false還能節(jié)省一次計算。 #這個損失的實(shí)例也是一個可調(diào)用的實(shí)例,到時候只要把y_hat和y傳進(jìn)去就可以了。optimizer =torch.optim.SGD(module.parameters(),lr=0.01) #這里是將moudle中的全部參數(shù)全部都放入其中了,是應(yīng)用于多層嵌套了。 #lr是優(yōu)化率,就是每次優(yōu)化多少的問題。4.寫一個訓(xùn)練的周期:前饋、反饋、更新就是一個周期了。
for epoch in range(1000):y_pred=module(x_data)loss=criterion(y_pred,y_data)#這里我們注意其實(shí)這里的loss是一個對象print(epoch,loss)#但是在打印的時候會自動調(diào)用__str__()criterion.zero_grad()#這里是進(jìn)行手動的梯度歸零。loss.backward()#用loss這個對象來反向傳播optimizer.step()#優(yōu)化器進(jìn)行一次優(yōu)化print("w=",module.linear.weight.item()) print("b=",module.linear.bias.item()) #z這里說明白就是打印w和b取出來的時候我們需要weight和bias, #但是注意他們是矩陣,所以我們需要使用item()來讓其成為一個數(shù)字。x_test=torch.Tensor([4.0]) y_test=module(x_test) print("y_test=",y_test)總結(jié)
以上是生活随笔為你收集整理的pytorch线性模型的基础使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch离线安装(探索尝试版本)
- 下一篇: 罗杰斯蒂回归