一.逻辑回归简述
- 逻辑回归的模型:
逻辑回归实质上是线性回归,把特征线性求和(一阶)之后再使用Sigmoid函数将结果映射到[0,1]区间,得到分类结果为1的概率大小。具体表达式如下:
h(w,x) =1/(1+exp(-(w*x+b)))
其中x为特征向量,可以表示为[x1,x2,…,xN],的取值范围为[0,1]表示分类结果为1的概率大小。通过公式可以看出,逻辑回归可以理解为单层的全连接网络加上sigmoid激活函数的神经网络结构,具体如下:
其中f(x)为sigmoid函数,函数图像为:
https://cloud.tencent.com/developer/news/91332
为什么要使用logistic函数:.
1、输入范围是−∞→+∞ ,而之于刚好为(0,1),正好满足概率分布为(0,1)的要求。我们用概率去描述分类器,自然比单纯的某个阈值要方便很多;
2.他是一个单调上升的函数,具有良好的连续性,不存在不连续点。
- 损失函数:
cost ( h θ ( x ) , y ) = − y i log ( h θ ( x ) ) − ( 1 − y i ) log ( 1 − h θ ( x ) ) \operatorname{cost}\left(h_{\theta}(x), y\right)=-y_{i} \log \left(h_{\theta}(x)\right)-\left(1-y_{i}\right) \log \left(1-h_{\theta}(x)\right) cost(hθ(x),y)=−yilog(hθ(x))−(1−yi)log(1−hθ(x))
推导:https://blog.csdn.net/bitcarmanlee/article/details/51165444
二、网络搭建
使用PyTorch定义线性回归模型一般分以下几步:
1.设计网络架构
2.构建损失函数(loss)和优化器(optimizer)
3.训练(包括前馈(forward)、反向传播(backward)、更新模型参数(update))
- 优化器
优化器基本使用方法:
建立优化器实例
循环:
清空梯度
向前传播
计算Loss
反向传播
更新参数
from torch import optim
# 通常的step优化过程
optimizer = optim.SGD(params=net.parameters(), lr=1)
optimizer.zero_grad() # net.zero_grad()
input_ = t.autograd.Variable(t.randn(1, 3, 32, 32))
output = net(input_)
output.backward(output)
optimizer.step()
完整代码:https://github.com/viki6666/Pytorch_learn/blob/master/logistic.ipynb
笔记:
一、理论
https://blog.csdn.net/bitcarmanlee/article/details/51165444
https://blog.csdn.net/qq_41641805/article/details/81514851
方法=模型+策略+算法
模型=logistic回归
策略=损失函数
算法=求解损失函数的方法(梯度下降)
二、程序解读:
class MyNet(torch.nn.Module)
,torch.nn.Module:继承torch.nn.Module类的意思。
Module类来自定义模型:https://blog.csdn.net/qq_27825451/article/details/90550890
我们在定义自已的网络的时候,需要继承nn.Module类,并重新实现构造函数__init__
构造函数和forward
这两个方法。但有一些注意技巧:
(1)一般把网络中具有可学习参数的层(如全连接层、卷积层等)放在构造函数__init__()
中;
(2)不具有可学习参数的层(如ReLU、dropout、BatchNormanation层)可放在构造函数__init__()
中,也可不放在构造函数中,如果不放在构造函数__init__
里面,则在forward
方法里面可以使用nn.functional来代替。
(3)forward
方法是必须要重写的,它是实现模型的功能,实现各个层之间的连接关系的核心。
_init_()
https://blog.csdn.net/geerniya/article/details/77487941
init的作用:创建指向当前实例的self,利用实例初始化属性,方便类中函数的调用
https://blog.csdn.net/qq_40130759/article/details/79664107
https://blog.csdn.net/weixin_40449300/article/details/80111212
1)class类包含:
类的属性:类中所涉及的变量
类的方法:类中函数
2)init函数(方法)
1.首先说一下,带有两个下划线开头的函数是声明该属性为私有,不能在类地外部被使用或直接访问。
2.init函数(方法)支持带参数的类的初始化 ,也可声明该类的属性 。
3.init函数(方法)函数的第一个参数是实例对象本身(self为习惯用法,也可以用别的名字),后续参数则可 以自由指定,和定义函数没有任何区别。
3)self
当前实例,用于访问当前实例的属性和方法。
https://blog.csdn.net/m0_37693335/article/details/82972925
def init(self, name等多参数), def init(self)两者区别:初始化时是否强制初始化所有属性,赋值灵活度。super( test, self).__init__()
代码解释:https://www.cnblogs.com/python-nameless/p/6229506.html
对继承自父类的属性,使用父类初始化函数进行初始化
首先找到test的父类(比如是类A),然后把类test的对象self转换为类A的对象,然后“被转换”的类A对象调用自己的__init__函数- operator.lt(a, b) #lt(a,b) 相当于 a < b
operator.le(a, b) #le(a,b) 相当于 a <= b
operator.eq(a, b) #eq(a,b) 相当于 a == b
operator.ne(a, b) #ne(a,b) 相当于 a != b
operator.ge(a, b) #gt(a,b) 相当于 a > b
operator.gt(a, b) #ge(a,b) 相当于 a >= b
中文文档,可查函数
注释性好的代码