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