pytorch——預測值轉換為概率,單層感知機,多層感知機,分類問題


softmax函數,可以將算出來的預測值轉換成0-1之間的概率形式

 

導數的形式

 

import torch
import torch.nn.functional as F
x=torch.tensor([3.3,2.2,1.0])
x.requires_grad_()
y=F.softmax(x,dim=0)
print('將x轉換成概率型的y',y)
print(y[0],x[0])
print('對y1進行求導,由於y是由所有xi來生成的,所以傳輸入的時候要把所有的x傳進去')
#由於y=0.6978,0.2323,0.07. 所以有導數公式dy1/dx1=0.6978*(1-0.6978)=0.2109  dy1/dx2=-0.6978*0.2323=-0.162
print('y0對上x0-x3三個方向上的導數',torch.autograd.grad(outputs=y[0], inputs=x))
y=F.softmax(x,dim=0)
print('y1對上x0-x3三個方向上的導數',torch.autograd.grad(outputs=y[1], inputs=x))
y=F.softmax(x,dim=0)
print('y2對上x0-x3三個方向上的導數',torch.autograd.grad(outputs=y[2], inputs=x))

單層感知機

 

x的上標代表層數,下面的下標代表的是節點的編號。w的上標是下一層,下標的第一位是上一層的節點的編號,第二位是上一層

第0層的n個節點通過權值相乘再累加得到下一層的x,然后x通過激活函數再計算損失

import torch
import torch.nn.functional as F

x=torch.rand(1,10)
w=torch.rand(1,10)
print('x向量',x,'w向量',w)
w.requires_grad_()
y=torch.sigmoid(x@w.t())  #是向量相乘然后求sigmoid函數變到下一層的神經元x
countshape=list(y.shape) #看它的shape
print(y.shape,countshape)
loss=F.mse_loss(torch.ones(countshape),y) #用torch.ones(shape值)和下層神經元x(y)求loss
print(loss)
# print(torch.ones(countshape))
loss.backward()
print(w.grad)  #求得y對所有的wi梯度

 多層感知機

 

#感知機的第二層有兩個x
x=torch.rand(1,10)
w=torch.rand(2,10)  #w有兩維,也就是兩組,意味着兩組分別與xi構成兩個下一層的
print('x向量',x,'w向量',w)  #這里是二維的,就說明
w.requires_grad_()
y=torch.sigmoid(x@w.t())  #是向量相乘然后求sigmoid函數變到下一層的神經元x
countshape=list(y.shape) #看它的shape
print(y.shape,countshape)
loss=F.mse_loss(torch.ones(countshape),y) #用torch.ones(shape值)和下層神經元x(y)求loss
print(loss)
# print(torch.ones(countshape))
loss.backward()
print(w.grad)  #求得yi(i屬於0--1)對所有的wj(j屬於0--9)梯度

 

鏈式法則

 

x=torch.tensor(1.)
w1=torch.tensor(2.)
w1.requires_grad_()
b1=torch.tensor(1.)
w2=torch.tensor(2.)
w2.requires_grad_()
b2=torch.tensor(1.)
y1=x*w1+b1
y2=y1*w2+b2
print('輸入的x(%s),經過w1(%s)和b1(%s),生成y1(%s).再通過w2(%s)和b2(%s)生成y2(%s)' %(x,w1,b1,y1,w2,b2,y2))
#現實的情況一般是已知輸入然后去求權重和偏置,因此最終要求的總梯度是dy2_dw1
dy2_dy1=torch.autograd.grad(y2,[y1],retain_graph=True)[0]
dy1_dw1=torch.autograd.grad(y1,[w1],retain_graph=True)[0]
print(dy2_dy1*dy1_dw1)
dy2_dw1=torch.autograd.grad(y2,[w1],retain_graph=True)[0]
print(dy2_dw1)

 

函數極小值的優化

1.用plt畫出圖像

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
def fomul(x):
    return (x[0]**2+x[1]-11)**2+(x[0]+x[1]**2-7)**2
x=np.arange(-6,6,0.1)
y=np.arange(-6,6,0.1)
X,Y=np.meshgrid(x,y)  #這一步是制作出x和y的網格化矩陣
print([X,Y])  #這一步是兩個網格化矩陣放進列表
Z=fomul([X,Y]) #將x的網格化矩陣和y的網格化矩陣放進公式計算出z的網格化矩陣

fig = plt.figure()
ax = plt.gca(projection='3d')
ax.plot_surface(X,Y,Z)
ax.view_init(60,-30)
plt.show()

 

邏輯回歸

使用sigmore函數轉變成概率

liner regression 和 logistic regression的區別:

  1. 輸出的區別. linear regression的輸出是連續的,在有限空間可取任意值;  logistic regression的輸出期望是離散的,只有有限個數值.
  2. 預期目標(label)的區別. linear regression的預期是連續變量,如auto-encoder模型預測一張圖像; logistir regression的預期是離散的類別.
  3. 最小化誤差的方法區別. 采用均方誤差的linear regression對於大的誤差施加二次倍數的懲罰, 而logistic regression把較大的誤差懲罰到一個漸進的常數.
  4. 先驗的區別.liner regression期望擬合訓練數據,通過feature的線性加權來預測結果; logistic regression是在訓練一個最大似然分類器

多分類問題

 

要將輸出值轉化到多分類的概率可以使用之前說的softmax函數來轉換

分類問題中常用的loss損失:cross entropy(交叉熵)

 

 

Dkl指的是散度,散開的程度,當p和q相等的時候重合的時候,散度是接近於0的因此H(p,q)就只等於H(p)

對於01編碼的情況時,[0 1 0 0], 熵=-1log1=0,此時交叉熵等於散度

 

二分類問題的公式推導。p的概率是預測標簽為1的概率。當標簽y=0的時候,相應的log(1-p)大也就是標簽1的概率要大。當標簽y=1的時候,相應的log(p)大也就是標簽0的概率要大。

 

 

分類的目的就是原本的q1的幾個概率沒有逼近1的,此時交叉熵也比較大。經過不斷的迭代q1里面出現有一個概率是非常接近1的,而且它的交叉熵此時會變得非常小。自然預測值就是那個概率最大的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM