《PyTorch深度学习实践》第六讲 logistic 回归

介绍分类任务中的Logistic Regression模型(名字是回归,但用于分类!)

mnist数据集和cifar数据集

类别之间没有数值大小的含义,不适合直接预测出是数字几。(比如7 和 9很像,可能不是7就是9,但数字上7和8更近)

所以转用概率,算出属于每个类的概率值,最后找出最大值即可。

cifar数据集

问题定义

把成绩预测的回归问题转换为分类问题,此处是2分类问题,由于和为1,只需要计算一个概率即可。

sigmoid函数

一篇文章搞懂logit, logistic和sigmoid的区别 - 知乎 (zhihu.com)

logit是模型的raw outputs, 还没有通过softmax layer. 也就是softmax layer的输入就是logit.
logistic function 是 logit funciton的反函数。这个函数的作用是把[-inf, inf]的数给映射到[0,1]范围内。
sigmoid function不是某一个函数,而是指某一类形如"S"的函数,都可以成为sigmoid的函数.

导函数长成这样的就是饱和函数,类似正态分布。

sigmoid函数满足:1.函数值有极限 2.单调的增函数 3.是饱和函数

这个函数学名是logistic函数,它是sigmoid函数的典型代表,在pytorch库中就把其称为sigmoid(约定俗成的叫法)。

书、论文中用西格玛表示logistic函数

逻辑回归模型

二分类的损失函数 BCE

比较的是两个分布之间的差异,不是在计算几何的度量空间的距离

KL散度

交叉熵 cross-entropy概念

loss中前面加了个-号变成了正值,越趋于0预测效果越好。(预测与标签越接近,BCE损失越小。

把这个损失函数称为BCE损失 binary cross entropy 二分类的交叉熵

举例使用

sigmoid函数是无参的,意味着不需要在构造函数里初始化它。没有参数可供训练,将来直接调用它即可。

代码的几处变化

选择求不求均值将来会影响如何选择学习率(求均值后,损失会变小

三处发生了变化

参考:(2条消息) PyTorch 深度学习实践 第6讲_错错莫的博客-CSDN博客

import torch
# import torch.nn.functional as F
 
# prepare dataset
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]])
 
#design model using class
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_pred = torch.sigmoid(self.linear(x))
        return y_pred
        
model = LogisticRegressionModel()
 
# construct loss and optimizer
# 默认情况下,loss会基于element平均,如果size_average=False的话,loss会被累加。
criterion = torch.nn.BCELoss(size_average = False) 
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)
 
# training cycle 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()
 
print('w = ', model.linear.weight.item())
print('b = ', model.linear.bias.item())
 
x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print('y_pred = ', y_test.data)

多输入一些数据进行测试并画图

输入的数据是一维线性的,经过sigmoid函数后预测值函数的形状与其类似

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0,10,200) #  在线性空间中以均匀步长生成数字序列
x_t = torch.Tensor(x).view((200,1))# 在pytorch中进行数据维度的变化
y_t = model(x_t) 
y = y_t.data.numpy() # 转换为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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值