刘二大人的pytorch深度学习实践(六)

写在前面的话

前段时间分别和两个研究方向类似的前辈交谈,虽然他们都计划不深造ldp领域,但都会成为优秀的程序员。
有两句话我印象深刻,一句是:“··需要意志坚定。”这句话我就不解释了,自己领会。
一句是,我和前辈说你就可以实现你的程序员梦了,前辈说,这不是梦,它只是一个职业。这两句话,与此时此刻正在看我博客的同学分享。

Logistics Regression理解

虽然叫逻辑斯蒂回归,但是是是二分类问题。本来我们的目标是训练数据,预测学习4小时后的分数是多大;现在的目标转换成为,训练数据,预测学习x个小时后通过考试的概率是多大。

两种回归比较

第一种是Linear Regression,第二种是Logistics Regression。

第一种是训练样本后,预测值。
在这里插入图片描述
在这里插入图片描述

第一种和第二种的比较,第一个是回归(左边),第二个是分类(右边)。线性模型和逻辑斯蒂回归的明显区别是在线性模型的后面,添加了激活函数(非线性变换)
在这里插入图片描述
在分类中,P(y^=1) + P(y^=0) = 1。在分类中,模型的输出是输入属于确切类别的概率。在这里插入图片描述

第二种,Logistics回归,是将值y映射到[0,1]中。我们经常叫Logistics回归叫做Sigmoid函数。
在这里插入图片描述
在这里插入图片描述

代码实现

步骤:
1.准备训练的数据集
2.使用类设计模型,继承nn.Module模型
3.构造损失和优化器,使用pytorch API
criterion:标准 ; optimizer:优化器
4.训练循环,forward,backward,update
5.绘图。提供新的数据集,x∈[0,10],取200个点,预测每个点通过的概率是多大。绘制p为0.5的直线,观察交点,发现,当x=2.5h的时候刚好概率为0.5,此时不能确定是否通过考试。 我们也可以看到,在直线上方的对应的时间就是能通过考试的,在直线下方的对应的时间就是不能通过考试的。

import numpy as np
import matplotlib.pyplot as plt
import torch
import torch.nn.functional as F

# 准备数据集
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[0],[0],[1]])

# 使用类设计模型,继承nn.Module模型


class LogisticRegressionModel(torch.nn.Module):
    def __init__(self):
        super(LogisticRegressionModel,self).__init__()
        self.linear = torch.nn.Linear(1,1)

    def forward(self,x):
        y_pred = F.sigmoid(self.linear(x))    #这里需要把原来的输出y传给sigmoid,即实现的区间的映射
        return y_pred


model = LogisticRegressionModel()

# 构造损失和优化器,使用pytorch API     criterion:标准 ; optimizer:优化器
criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)

# 训练循环,forward,backward,update

for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch,loss.item)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()


x = np.linspace(0,10,200)           # 每周学习0~10小时,采200个点
x_t = torch.Tensor(x).view((200,1))     # 类似reshape()的作用,变成200行一列
y_t = model(x_t)
y = y_t.data.numpy()        # numpy的意思是转换成n维数组
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()

在这里插入图片描述

补充知识

torch.sigmoid()、torch.nn.Sigmoid()和torch.nn.functional.sigmoid()三者之间的区别
在这里插入图片描述
在这里插入图片描述

import torch
import torch.nn as nn
import torch.nn.functional as F

x = torch.tensor([0.5, -0.5, 1.0])

# 使用torch.sigmoid()
output = torch.sigmoid(x)
print(output)  # 输出: tensor([0.6225, 0.3775, 0.7311])

# 使用torch.nn.Sigmoid()
sigmoid = nn.Sigmoid()
output = sigmoid(x)
print(output)  # 输出: tensor([0.6225, 0.3775, 0.7311])

# 使用torch.nn.functional.sigmoid()
output = F.sigmoid(x)
print(output)  # 输出: tensor([0.6225, 0.3775, 0.7311])

在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值