刘二第六讲逻辑回归

import torch
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt

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


class LogisticRegressModel(torch.nn.Module):
    """
    LinearModel该类继承自torch.nn.Module,Module类中有多种方法可用
    LinearModel该类必须实现两个方法,一个是__init__另一个是forward
    __init__即该类的构造行数,初始化对象时默认调用
    forward是来实现前馈时所要进行的计算,
    而关于反馈计算,Module构造的对象会根据计算图(Module会构建计算图)自动进行反馈计算
    也可自己定义反馈求导,对于pytorch支持的计算,可以自己定义类,而对于pytorch不支持的也可继承Functions类来实现


    模型继承:linear模型
    linear(1, 1)是特征和输出的维度为一维
    forward:构建模型中的各个层的关系---也是输出怎么到输出的,用到哪些层;---可以调用__init__里的函数
    __init__:通多调用nn.Module中函数进行搭建每一层所用到的函数,函数的参数
    forward:将__init__中的搭建好的函数连通起来,告诉我们怎么连通,叙述整个流程
    """

    def __init__(self):#重写父类的构造函数
        super(LogisticRegressModel, self).__init__()#同时继承父类的构造函数
        self.linear = torch.nn.Linear(1, 1)#输入维度和输出维度,即W的矩阵
        # 通过torch中的Linear类构造一个对象(类加括号是在构造对象),该Linear包含权重w和偏执b这两个tensor,
        # 自动进行wx+b的运算,而且Linear也是继承自Module,因此也会自动进行反向传播


    def forward(self, x):
        # 重写Model中forward函数,同时在Model类中的__call__函数中调用forward函数
        # 也就是说可以通过Model的实例直接传参到该函数(callable)
        y_pred = F.sigmoid(self.linear(x))
        #linear也是构造于Model,也是callable的
        return y_pred


"""
模型的实例化
调用损失函数--criterion
选择优化器,学习率设置为0.01;同时其他的值通过model.parameters()函数进行初始化。
里面自己有各种参数,权重 偏置
"""
model = LogisticRegressModel()
criterion = torch.nn.BCELoss(size_average=False)
#损失函数,第一个值表示是否要求均值,第二个值表示是否需要求和来降维,criterion需要yheat和y
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
#优化器,注意不是来自Model类,所以不会生成计算图,这是给SGD这个类进行实例化,
# 第一个参数params,在这里传入的是model的一个函数model.parameters(),
# 该方法会检查model中的所有成员,通过调用了linear.parameters()方法,获得所有权重,
# 会将需要优化的权重都加到需要训练的参数集合上
#lr即学习率
for epoch in range(1000):

    y_pred = model(x_data)
    #模型传入特征值--返回预测值y_pred
    loss = criterion(y_pred, y_data)
    # 往损失函数-criterion-中传入预测值和真实值--返回损失值loss
    print(epoch, loss.item())
    #输出当前迭代次数 + 当前损失值
    optimizer.zero_grad()
    #通过zero_grad函数将之前的梯度值(即损失函数的导数)设置为0
    loss.backward()
    # .backward进行反向传播
    optimizer.step()
    #optimizer.step(),通过前面算出的梯度和学习率进行w和偏置b的迭代更新

"""
输出最后的权值w
输出最后的偏置b
设置测试集数据
将测试集放入模型中进行预测
通过.data 输出预测数据
"""
# print('w = ', model.linear.weight.item())
# print('b = ', model.linear.bias.item())
#
# x_test = torch.Tensor([[4.0]])
# y_test = model(x_test)
# print('y_pred = ', y_test.data)
x = np.linspace(0,10,200)
x_t = torch.Tensor(x).view((200,1))
y_t = model(x_t)
y = y_t.data.numpy()
plt.plot(x,y)
plt.plot([0,10],[0.5,0.5],c='r')
plt.xlabel('Hours')
plt.ylabel('Prob of pass')
plt.grid()
plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值