罗杰斯蒂回归
1.和線性模型的區別
我們估計的一個目標是一個連續的輸出,這時候就是一個回歸的任務。
 分類問題就是估計是已知的有限的集合當中選擇一個的問題。那么我們如果我們這時候使用一個將輸出轉化為離散數值的情況。
 這樣做是不好的,因為我們假定將ABC三種輸出分別對應成為123,那么將存在這樣的一種問題:
 1.原來的輸出ABC之間的差異只是有差異,但是并不一定是完全相等的,例如我們可能存在A和B是特別相似的但是B和C的差異是十分巨大的。所以我們不能簡單的將其對應為數字。
 2.還有一個問題就是A和B之間是沒法確定其有明確的大小關系的,所以我們不能將其簡單的對應為一個數字。
 還有很多問題,之后將會補充。。
 所以我們現在不能使用這種對應,所以我們在分類問題當中我們輸出的是一個概率,例如他是A的概率P(A)、他是B的概率P(B)、他是C的概率P?。之后我們再從這些分類當中找出一個最大值就可以知道這個是什么了。
2.解決引入數據集的問題
我們使用
 trian_set = torchvision.datasets.MNIST(root=’./data’,train=True,download=True)
 引入數據集的時候出現了這個錯誤,提示我們網頁不可達。
 
 我們試一下發現這個網頁確實打不開,所以一定是要做一個本地了。
 MNIST數據集資源是在csdn下載的,之后我們在代碼中轉到定義,改成我們本地的一個源,改一下他的url。
 
 先做一個本地的源:
 
改成這個樣子
 
保存一下重新啟動。再測試一下成功了。
 
3.分類的問題
3.1二分類的問題
二分類的時候我們其實只算一個就行了,不用算兩個因為其中的兩個的加和就是1。如果最后的得出的概率是十分接近0.5的那么我們就沒有十足的把握做出判斷例如0.51.這時候就會輸出一個待定,或是直接輸出一個值。
3.2羅杰斯特回歸
以前的輸出是一個實數,現在的輸出變成了一個概率,所以就變成了(0,1)的一個區間。我們羅杰斯特方法其實就是將實數映射到一個(0,1)。
 
可以看到函數超過某一個閾值之后變化是十分緩慢的。這種函數在數學當中叫做飽和函數。羅杰斯特其實是由于正態分布所產生的函數。sigmoid函數其實不僅僅羅杰斯特函數一家。還有很多家,都滿足(0,1)、單調遞增、飽和函數。因為其中羅杰斯特函數是sigmoid中的典型代表。所以在很多情況下,我們都將兩者等同起來。
 
可以看到兩種模型的主要區別就是多了一個羅杰斯特函數做變換的過程。
 
3.3損失函數的變化
我們注意這里的損失函數也會發生變化了,我i們本身輸出的是一個數值,所以我們可以使用方差來表示一個損失函數。但是我們這次得到的結果是一個概率,所以沒有所謂的數軸上的距離這個數學意義了,所以我們使用原來的損失函數就不好了。
 
這里我們應當選擇可以計算兩種分布的差異性大小的損失函數,有下面兩種:
 kl散度:(待補充)
 交叉熵:借助實際的例子我們可以理解交叉熵函數可以反應兩種分布的差異
 
 注:概率都是小于1的所以log函數的值是一個負值,所以需要加一個符號來調成一個正的。
4.代碼實現
import numpy import torch import torchvision import torch.nn.functional as func #trian_set = torchvision.datasets.MNIST(root='./data',train=True,download=True) # test_set =torchvision.datasets.MNIST(root='./data',train=False,download=True) #這里的train表示你是需要一個訓練集還是一個測試集 #download表示是不是沒有了要去下載。torchvision中的數據集大多都是這種操作。 #CIFAR 是十種彩色圖片, # trian_set = torchvision.datasets.CIFAR10(root='./data',train=True,download=True) # test_set =torchvision.datasets.CIFAR10(root='./data',train=False,download=True) x_data=torch.Tensor([[1.0],[2.0],[3.0]]) y_data=torch.Tensor([[0],[0],[1]]) class LogisticRegressionModel(torch.nn.Module):def __init__(self):super(LogisticRegressionModel,self).__init__()self.linear=torch.nn.Linear(1,1)#因為sigmoid是沒有任何參數的,所以我們不需要額外定義參數。def forward(self,x):y_pred=func.sigmoid(self.linear(x))#這里其實就是在定義forward函數的時候增加了一部sigmoid的計算。return y_predcriterion = torch.nn.BCELoss(size_average=True) model= LogisticRegressionModel() #這里的bce是交叉熵損失函數的問題 #這里求均值的時候其實還會影響到學習率的選擇問題,因為是不是求平均會影響梯度的大小 opitmizer =torch.optim.SGD(model.parameters(),lr=0.01) #優化器是不變的 for epoch in range(1000):y_hat=model(x_data)loss=criterion(y_hat,y_data)print(epoch,loss.item())criterion.zero_grad()loss.backward()opitmizer.step() x_test=torch.Tensor([4.0]) y_test=model(x_test) print('4.0的情況為',str(y_test[0][0]))總結
                            
                        - 上一篇: pytorch线性模型的基础使用
 - 下一篇: pytorch处理多维输入的问题