Demo6: Logistic回归
来源:B站 刘二大人

说明:

  1. Logistic回归和线性回归的明显区别是Logistic回归在线性回归后添加了激活函数(非线性变换)
  2. 分布的差异:KL散度,cross-entropy交叉熵
  3. 预测与标签越接近,BCE损失越小。BCELoss 是CrossEntropyLoss的一个特例,只用于二分类问题(二分类时推荐使用)。而CrossEntropyLoss可以用于二分类,也可以用于多分类.
    torch.nn.BCELoss()详解
  4. 视频中代码F.sigmoid(self.linear(x))会引发warning,此处更改为torch.sigmoid(self.linear(x)).
    torch.sigmoid()、torch.nn.Sigmoid()和torch.nn.functional.sigmoid()三者之间的区别

Logistic回归代码

# logistic回归
import torch

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


# design model
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 = torch.sigmoid(self.linear(x))
        return y_pred


model = LogisticRegressionModel()

# construct loss and optimizer
# save_average = False 的话,误差会累加,不会做平均
criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # model.parameters()自动初始化参数, lr学习率

# training cycle : forward,backward,update(optimizer.step())
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 = torch.tensor([[4.0]])
y_test = model(x_test)  # 这里权重已经更新完,保存下来了

print('x=', x, 'y_pred=', y_test)

NOTICE:
如果用

x_data = torch.tensor([[1.0], [2.0], [3.0]])
y_data = torch.tensor([[0], [0], [1]])

就会报错,自己务必试一试,然后点击这里,思考下为什么哦

其他:
BCE loss代码帮助理解
target 中的数据需要是浮点型

import math
import torch
# 解密啦,用torch.tensor的话,x,y都需要是浮点数才行,不然就会报错
pred = torch.tensor([[-0.2],[0.2],[0.8]])
target = torch.tensor([[0.0],[0.0],[1.0]])

sigmoid = torch.nn.Sigmoid()
pred_s = sigmoid(pred)
print(pred_s)

result = 0
i=0
for label in target:
    if label.item() == 0:
        result +=  math.log(1-pred_s[i].item())
    else:
        result += math.log(pred_s[i].item())
    i+=1
result /= 3
# 打印出来会看到,BCE本质上就是二分类交叉熵损失的平均误差
print("bce:", -result)
loss = torch.nn.BCELoss()
print('BCELoss:',loss(pred_s,target).item())

在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐