跟着刘二大人学pytorch(第---6---节课之逻辑回归)

0 前言

0.1、课程链接:

《PyTorch深度学习实践》完结合集
有大佬已经写好了笔记:大佬的笔记
pytorch=0.4

0.2、课件下载地址:

链接:https://pan.baidu.com/s/1_J1f5VSyYl-Jj2qIuc1pXw
提取码:wyhu

6、逻辑回归

Linear Regression
损失函数值需要是一个标量值
以下代码可以作为深度学习的一个框架,可以在此基础上进行拓展,作为比较大的模型的拓展。
以后都是在这4步上面进行拓展
1、prepare dataset
2、Design model using Class
3、Construct loss and optimizer
4、Training cycle
准备数据:

所有符合()的函数都称为sigmoid函数,sigmoid函数中最出名的函数就是logistic函数,有些框架中直接将logistic函数称为sigmoid函数。
有些材料里面介绍1/1+e-x就是sigmoid函数,是因为这个函数是sigmoid函数中最具有典型性的函数。
1/1+e-x学名叫logistic函数,在pytorch库中称其为sigmoid函数(约定俗称的叫法)。
在深度学习的论文中西格玛函数就是logistic函数
它在论文中使用的比较多,是因为它能保证输出值在(0,1)之间
线性回归和逻辑回归之间的关系:
在这里插入图片描述
线性回归和逻辑回归在二分类任务中的损失函数比较:
线性回归的损失函数度量的是两个实数之间的距离,逻辑回归的损失函数度量的是两个分布之间的距离。
在这里插入图片描述
在数理统计中计算两个分布之间的距离:KL散度、cross-entropy
交叉熵的定义:
现在有两个分布PD1(x)、PD2(x)
交叉熵就是ΣPD1(x)lnPD2(x)
用这个式子来表示两个分布之间差异的大小
例如:
在这里插入图片描述
希望这个值能够越大 越好

在这里插入图片描述
y=1的时候,loss = -ylogy_hat= -logy_hat,这个loss越小越好,即logy_hat越大越好,即y_hat越大越好,即y_hat越接近1越好
y=0的时候,loss = -log(1-y_hat),这个loss越小越好,即log(1-y_hat)越大越好,即1-y_hat越大越好,即y_hat越接近0越好
这个函数叫做BCE函数,
在这里插入图片描述
在西格玛函数那里不需要参数,因此在初始化函数那里不用初始化,只需要在forward函数中添加该函数
sigmoid函数在torch.nn.functional.sigmoid中
在这里插入图片描述
BEC就是而分类的交叉熵损失函数(cross entropy函数),Binary Classification Erro
size_average = False这个是说小批量样本的损失值是否求均值。求不求只会影响学习率的设置。如果算了损失值的平均值,损失值在对参数w求导数的时候,这个导数上面也会带上这个1/N,因此学习率的设置也会受到相应影响。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
编写任何一个深度学习模型都可以使用以上的代码结构
准备数据集: 读取数据可能很复杂,封装到一个模块中,并提供一些工具函数或工具类

模型构造: 定义相应的模型,如果模型很复杂就直接放在单独的一个文件中,构造这个模型,然后在主程序中import进来
损失函数和优化器: 设计自己的损失函数需要继承nn.module模块,设计自己的损失函数,优化器也一样
主程序中的训练循环: 预测值、损失值都弄好了就使用上面的代码顺序做就好了

模型的测试:
在这里插入图片描述
代码

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

# 准备数据集
data_x = torch.Tensor([[1],[2],[3]])
data_y = torch.Tensor([[0],[0],[1]])

# 使用一个类设计一个模型
class LRModel(torch.nn.Module):
    def __init__(self):
        super(LRModel,self).__init__()
        self.linear = torch.nn.Linear(1,1)

    def forward(self, x):
        z = self.linear(x)
        y_pred = F.sigmoid(z)
        return y_pred

model = LRModel()

# 建立损失函数和优化器
# criterion是标准的意思
criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

epoch_list = []
loss_list = []
# 建立训练循环
for epoch in range(100):

    y_pred = model(data_x)
    loss = criterion(y_pred, data_y)

    print(epoch, loss.item())

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    epoch_list.append(epoch)
    loss_list.append(loss)

c = torch.Tensor([[6]])
print("(在训练后)输入:",6,"预测:",model(c).item())

plt.plot(epoch_list, loss_list)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饿了就干饭

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值