PyTorch深度学习实践(六)逻辑斯蒂回归

虽然叫回归,但是是做分类的

线性回归模型
在这里插入图片描述
单样本损失
在这里插入图片描述在线性空间,我们的估计值y属于一个连续的空间,这种任务叫做回归任务,但是在很多的机器学习任务中,我们要做的是分类
比如ministr数据集,训练集60000个,测试集10000个,有10个分类,我们模型估算出来的结果是一个0…9离散值的集合,我们要估算的是y属于哪一个,这种问题叫做分类问题
然而我们并不是输出输入的样本所属的类别,而是输出它属于每个类别的概率,概率最大的一项作为我们分类的结果

逻辑斯蒂函数在这里插入图片描述要把y^从实数空间映射到[0,1],即需要找到一个函数,能够把输出映射到0到1之间
逻辑斯蒂函数的导函数长这样,我们把它叫做饱和函数
在这里插入图片描述做分类时可以用线性模型,再把输出用sigmoid函数算一下

这些都叫sigmoid函数,满足函数值有极限,函数值在(-1,1)之间,都是单调增函数,都是饱和函数,满足这几个条件就叫sigmoid函数,在所有的sigmoid函数中逻辑斯蒂函数最出名,所以现在有些框架里面就直接把逻辑斯蒂函数叫做sigmoid函数,在pytorch里面逻辑斯蒂函数就叫做sigmoid函数
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
BCE损失,如表,当预测越接近真实值,BCE损失越小
在这里插入图片描述linear直接求出来这个地方的值,再经过逻辑斯蒂函数输出
在这里插入图片描述

import torch
import numpy as np 
import torch.nn.functional as F
import matplotlib.pyplot as plt
x_data=torch.Tensor([[1.0],[2.0],[3.0]])#构建数据集
y_data=torch.Tensor([[0],[0],[1]])
class LogistRegressionModel(torch.nn.Module):#括号里面表示继承类
    def __init__(self):#构造函数
        super( LogistRegressionModel,self).__init__()#调用父类的构造
        self.linear=torch.nn.Linear(1,1)
        #torch.nn.Linear是pyTorch里面的一个类,加了括号就是实例化对象,包含了权重和偏置两个张量  
        #可以直接用Linear完成 权重*输入+偏置的计算
        #Linear也是继承自Module,所以可以自动进行反向传播
        #nn:Neural Network神经网络
        #linear是由Linear实例化得到的
    def forward(self,x):
        y_pred= F.sigmoid(self.linear(x))
        return y_pred
    #构造函数用于初始化对象, forward是前馈过程中需要执行的计算,没有backward,这是因为
    #Module构造的对象会根据你的计算图自动实现backward
model= LogistRegressionModel()#用模型的时候这样调用,也可以传入参数x,x就送入forward函数,计算出y_pred
criterion=torch.nn.BCELoss(size_average=False)#构造损失函数
#MSELoss需要有y,y_pred,然后构造计算,用MSELoss的共识算出来是一个向量,再把向量求和,最后得出标量的损失值
#MSELoss的计算过程也要构建计算图,只要是需要构建计算图,就应该是继承自Module,MSELoss继承自nn.Module
#size_average=False表示得到的损失不求均值
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)#构造优化器
#优化器不会构建计算图 torch.optim.SGD是一个类,带了参数就是实例化了这个类
#model.parameters()会检查model里面所有的成员,如果成员里面有相应的权重,就把这些都加到最后训练的参数集合上
#lr是学习率,当模型比较复杂,pyTorch还支持对模型的不同部分使用不同的学习率,w=w-lr*(损失对权重的导数)

#训练过程
for epoch in range(1000):
    y_pred=model(x_data)#先在前馈里面算出y_pred
    loss=criterion(y_pred,y_data)#算损失
    print(epoch,loss.item())#loss是一个对象是标量,打印的时候会自动调用__str__(),不会产生计算图
    
    optimizer.zero_grad()#进行训练的时候梯度归零
    loss.backward()#反向传播
    optimizer.step()#更新,step函数用于更新,会根据所有参数里面所包含的梯度以及预先设置的学习率进行更新
#output weight and bias
#print('w=',model.linear.weight.item())
#print('w = ', model.linear.weight.item()) 
#print('b=',model.linear.bias.item())
#Test model
#x_test=torch.Tensor([4.0])#测试模型输入的是1*1的矩阵
#y_test=model(x_test)
#print('y_pred=',y_test.data)
x = np.linspace(0, 10, 200)
x_t = torch.Tensor(x).view((200, 1)) 
y_t = model(x_t) 
y = y_t.data.numpy() 
plt.plot(x, y)
plt.plot([0, 10], [0.5, 0.5], c='r') 
plt.xlabel('Hours') 
plt.ylabel('Probability of Pass') 
plt.grid() 
plt.show()

结果展示

510 1.3073418140411377
511 1.3065340518951416
512 1.3057273626327515
513 1.304922103881836
514 1.3041179180145264
515 1.3033146858215332
516 1.3025126457214355
517 1.3017117977142334
.............
..............
994 1.0171440839767456
995 1.0166999101638794
996 1.0162560939788818
997 1.0158131122589111
998 1.01537024974823
999 1.0149281024932861

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值