PyTorch深度学习实践 第六讲---实现Logistic回归
Demo6:Logistic回归
·
Demo6: Logistic回归
来源:B站 刘二大人
说明:
- Logistic回归和线性回归的明显区别是Logistic回归在线性回归后添加了激活函数(非线性变换)
- 分布的差异:KL散度,cross-entropy交叉熵
- 预测与标签越接近,BCE损失越小。BCELoss 是CrossEntropyLoss的一个特例,只用于二分类问题(二分类时推荐使用)。而CrossEntropyLoss可以用于二分类,也可以用于多分类.
torch.nn.BCELoss()详解 - 视频中代码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())

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