当前位置:   article > 正文

深度学习06—逻辑斯蒂回归(torch实现)_torch.nn.sigmoid

torch.nn.sigmoid

目录

1. 线性模型回顾

2.做分类问题:逻辑斯蒂回归模型

2.1 常见数据集

2.2 逻辑回归与线性回归的区别

 2.3 逻辑回归使用的损失函数和优化器

 2.4 模型构建

2.4.1 torch.sigmoid()、torch.nn.Sigmoid()和torch.nn.functional.sigmoid()三者之间的区别

2.4.2 二分类的交叉熵(BCELoss)

2.4.3 代码一览 

2.5  pytorch代码

2.5.1 对比代码学习

2.5.2 BCE loss的理解代码


结合下文辅助学习:
传送门

1. 线性模型回顾

2.做分类问题:逻辑斯蒂回归模型

2.1 常见数据集

torchvision 模块

2.2 逻辑回归与线性回归的区别

 2.3 逻辑回归使用的损失函数和优化器

 

 2.4 模型构建

2.4.1 torch.sigmoid()、torch.nn.Sigmoid()和torch.nn.functional.sigmoid()三者之间的区别

torch.sigmoid():
这是一个方法,包含了参数和返回值。

torch.nn.Sigmoid():
可以看到,这个是一个类。在定义模型的初始化方法中使用,需要在_init__中定义,然后在使用。

 

torch.nn.functional.sigmoid():
这其实是一个方法,可以直接在正向传播中使用,而不需要初始化。**在训练模型的过程中,也可以使用。**例如:

 

这三个sigmoid()实现的功能是一样的,没有区别。
 

2.4.2 二分类的交叉熵(BCELoss)

2.4.3 代码一览 

 

2.5  pytorch代码

  1. import torch
  2. import torch.nn.functional as F #该模块中含有较多激活函数
  3. x_data = torch.Tensor([[1.0],[2.0],[3.0]])
  4. y_data = torch.Tensor([[0],[0],[1]])
  5. class LogisticRegresssionModel(torch.nn.Module):
  6. def __init__(self):
  7. super(LogisticRegresssionModel,self).__init__()
  8. self.linear = torch.nn.Linear(1,1)
  9. def forward(self,x):
  10. y_pred = F.sigmoid(self.linear(x)) #非线性化线性数据
  11. return y_pred
  12. model = LogisticRegresssionModel()
  13. #选择损失函数与优化器
  14. criterion = torch.nn.BCELoss(size_average=False)
  15. optimizer = torch.optim.SGD(model.parameters(),lr=0.01)
  16. for epoch in range(100):
  17. y_pred = model(x_data) #做预测
  18. loss = criterion(y_pred,y_data) #求损失
  19. print("当前的epoch:",epoch,'loss的值为:',loss.item()) #拿到loss的值需要.item()
  20. optimizer.zero_grad() #梯度清零
  21. loss.backward()
  22. optimizer.step() #更新参数

结果:

2.5.1 对比代码学习

  1. import torch
  2. # import torch.nn.functional as F
  3. # prepare dataset
  4. x_data = torch.Tensor([[1.0], [2.0], [3.0]])
  5. y_data = torch.Tensor([[0], [0], [1]])
  6. # design model using class
  7. class LogisticRegressionModel(torch.nn.Module):
  8. def __init__(self):
  9. super(LogisticRegressionModel, self).__init__()
  10. self.linear = torch.nn.Linear(1, 1)
  11. def forward(self, x):
  12. # y_pred = F.sigmoid(self.linear(x))
  13. y_pred = torch.sigmoid(self.linear(x))
  14. return y_pred
  15. model = LogisticRegressionModel()
  16. # construct loss and optimizer
  17. # 默认情况下,loss会基于element平均,如果size_average=False的话,loss会被累加。
  18. criterion = torch.nn.BCELoss(size_average=False)
  19. optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
  20. # training cycle forward, backward, update
  21. for epoch in range(1000):
  22. y_pred = model(x_data)
  23. loss = criterion(y_pred, y_data)
  24. print(epoch, loss.item())
  25. optimizer.zero_grad()
  26. loss.backward()
  27. optimizer.step()
  28. print('w = ', model.linear.weight.item())
  29. print('b = ', model.linear.bias.item())
  30. x_test = torch.Tensor([[4.0]])
  31. y_test = model(x_test)
  32. print('y_pred = ', y_test.data)

2.5.2 BCE loss的理解代码

  1. import math
  2. import torch
  3. pred = torch.tensor([[-0.2],[0.2],[0.8]])
  4. target = torch.tensor([[0.0],[0.0],[1.0]])
  5. sigmoid = torch.nn.Sigmoid()
  6. pred_s = sigmoid(pred)
  7. print(pred_s)
  8. """
  9. pred_s 输出tensor([[0.4502],[0.5498],[0.6900]])
  10. 0*math.log(0.4502)+1*math.log(1-0.4502)
  11. 0*math.log(0.5498)+1*math.log(1-0.5498)
  12. 1*math.log(0.6900) + 0*log(1-0.6900)
  13. """
  14. result = 0
  15. i=0
  16. for label in target:
  17. if label.item() == 0:
  18. result += math.log(1-pred_s[i].item())
  19. else:
  20. result += math.log(pred_s[i].item())
  21. i+=1
  22. result /= 3
  23. print("bce:", -result)
  24. loss = torch.nn.BCELoss()
  25. print('BCELoss:',loss(pred_s,target).item())

注:文章为自我学习记录,欢迎讨论,侵删

逻辑斯蒂回归复盘总结:
逻辑回归与线性回归的区别:
        线性回归是输出样本点x对应的标签y;逻辑回归输出的是样本x对应的概率;
        线性回归用的是平方损失;逻辑回归用交叉熵损失(torch.nn.BCELoss())。
        在构建模型时,逻辑回归比线性回归多了一步torch.nn.functional.sigmoid()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/205904
推荐阅读
相关标签
  

闽ICP备14008679号