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