(五)PyTorch深度学习:Logistic回归

Sigmoid function函数(函数值[-1, 1 ],单调递增)

1、Logistic Function(Logistic 函数),(最广泛):

x取值范围 [-无穷, +无穷], 函数值的范围 [0,1],使得函数值相当于是一个概率值。一般把函数模型输出值(如:y = w * x + b)当作Logistic 函数中的 x 值,从而得到一个概率值。

在这里插入图片描述

2、Logistic 函数曲线图:

在这里插入图片描述

2、还有其它属于Sigmoid functions的函数:

在这里插入图片描述

3、我们知道线性回归(Linear Regression)的损失函数为:loss = (y_pred - y) ** 2 = (x * w - y) ** 2 ,这更是求两个值的距离差。相对于线性回归损失函数,二值化分类(Binary Classification)损失函数(BCELoss):loss = - (y * log(y_pred) + (1 - y) * log(1 - y_pred) )。其中线性回归函数中的 y 和 y_pred 是几何距离差异,二值化分类函数中的 y 和 y_pred 是分布差异(非0,即1)。

在这里插入图片描述

  • 令 y =1, 损失函数可以写成:loss = - log(y_pred),要使loss最小,y_pred取值要最大(取1);
  • 令 y =0, 损失函数可以写成:loss = log(1 - y_pred),要使loss最小,y_pred取值要最小(取0);
  • 当真实为y,预测值(y)越接近y值,BCE Loss损失函数越小;
    在这里插入图片描述

4、完整代码:

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]])    # 第0类,第1类

# 设计Logistic回归模型
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))  # 对self.linear(x)进行非线性变化
       return y_pred

# 想使用模型,就实例化即可,可以直接调用
model = LogisticRegressionModel()

# 令 y =1, BCELoss损失函数可以写成:loss = - log(y_pred),要使loss最小,参数调整(权重w和偏置b),y_pred取值要最大(取1)
# 令 y =0, BCELoss损失函数可以写成:loss = log(1 - y_pred),要使loss最小,参数调整(权重w和偏置b),y_pred取值要最小(取0)
# 当真实为y,预测值(y)越接近y值,BCE Loss损失函数越小

# 构建损失函数、优化器
criterion = torch.nn.BCELoss(size_average=False)     # BCE损失
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)   # # model.parameters(),检查model所有的权重;lr:学习率

# 循环训练
for epoch in range(1000):
   y_pred = model(x_data)
   loss = criterion(y_pred, y_data)
   # print("迭代第:",epoch, "y_pred = ", y_pred, "损失值 = ", loss.item())
   print("迭代第:{}, y_pred = {}, 损失值 = {}".format(epoch, y_pred, loss.item()))    # 进行非线性变化得到y_pred

   optimizer.zero_grad()   # 梯度归零
   loss.backward()         # 反向传播
   optimizer.step()        # 参数优化更新(根据学习率lv:0.01更新)


print('w = ',model.linear.weight.item())
print('b = ', model.linear.bias.item())

x_test = torch.Tensor([4])
y_test = model(x_test)
print(("当 x_test = 4 时,y_pred = 1 的概率:{}").format(y_test.data))

运行结果:

根据x,y的数据:

x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]])   # 第0类,第1

预测当x_test = torch.Tensor([4.0])时,

每次训练更新的权重w、b可能会不同。
在这里插入图片描述

输入x = 4,y_pred = 0.86821

带入其他数据,绘制下图。

在这里插入图片描述
参考了Lecturer: Hongpu Liu主讲的视频。

猜你喜欢

转载自blog.csdn.net/K_AAbb/article/details/125740874