介绍分类任务中的Logistic Regression模型(名字是回归,但用于分类!)
mnist数据集和cifar数据集
类别之间没有数值大小的含义,不适合直接预测出是数字几。(比如7 和 9很像,可能不是7就是9,但数字上7和8更近)
所以转用概率,算出属于每个类的概率值,最后找出最大值即可。
![](https://i-blog.csdnimg.cn/blog_migrate/ee6826f06f412217fd435863a5b5ebfc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7a1d535db9af03d3108681b09857cb84.png)
cifar数据集
![](https://i-blog.csdnimg.cn/blog_migrate/61313f2df2b0f438ec26a3e48285b26a.png)
问题定义
把成绩预测的回归问题转换为分类问题,此处是2分类问题,由于和为1,只需要计算一个概率即可。
![](https://i-blog.csdnimg.cn/blog_migrate/f8266f6db7cabd7b9d943d5a2426d214.png)
sigmoid函数
![](https://i-blog.csdnimg.cn/blog_migrate/ee6b6edae92313988b70e4f58a49ecd4.png)
一篇文章搞懂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的函数.
![](https://i-blog.csdnimg.cn/blog_migrate/1e99211cee360ddc650524a9bec34c49.png)
导函数长成这样的就是饱和函数,类似正态分布。
sigmoid函数满足:1.函数值有极限 2.单调的增函数 3.是饱和函数
这个函数学名是logistic函数,它是sigmoid函数的典型代表,在pytorch库中就把其称为sigmoid(约定俗成的叫法)。
书、论文中用西格玛表示logistic函数
逻辑回归模型
![](https://i-blog.csdnimg.cn/blog_migrate/157c76495e92fc3963e95d493db974cc.png)
二分类的损失函数 BCE
比较的是两个分布之间的差异,不是在计算几何的度量空间的距离
![](https://i-blog.csdnimg.cn/blog_migrate/55dfda8d66d5563a65405060c4ba196d.png)
KL散度
交叉熵 cross-entropy概念
![](https://i-blog.csdnimg.cn/blog_migrate/1c410fcdc8d72f48e1bd2892073815ec.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c2ff99d258bab611f6dccccfd5e4c8c4.png)
loss中前面加了个-号变成了正值,越趋于0预测效果越好。(预测与标签越接近,BCE损失越小。)
![](https://i-blog.csdnimg.cn/blog_migrate/551c9468f5cd2cfd548ea7384fce3205.png)
把这个损失函数称为BCE损失 binary cross entropy 二分类的交叉熵
举例使用
![](https://i-blog.csdnimg.cn/blog_migrate/69a8ab8441d9d8cff83cd0f19f965cf0.png)
sigmoid函数是无参的,意味着不需要在构造函数里初始化它。没有参数可供训练,将来直接调用它即可。
代码的几处变化
![](https://i-blog.csdnimg.cn/blog_migrate/2b5a185d8ca97ec7469238aca9855cda.png)
![](https://i-blog.csdnimg.cn/blog_migrate/83dee181649a04869810dbcb1d96d7df.png)
选择求不求均值将来会影响如何选择学习率(求均值后,损失会变小)
三处发生了变化
![](https://i-blog.csdnimg.cn/blog_migrate/ac93c9cc439b06d86ab7a08d8dcfa50e.png)
参考:(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()
![](https://i-blog.csdnimg.cn/blog_migrate/fa1304da092fdc4749cd2a7d65061207.png)