刘二大人《PyTorch深度学习实践》p6逻辑斯蒂回归

一、零碎知识点

1.torchvision

TorchVision提供了一些方便的函数和类,用于加载和预处理常见的图像数据集,如MNIST、CIFAR10、ImageNet等。它可以自动进行图像数据的下载、数据的分割和转换,以及数据集的加载和批处理。
MNIST:手写数据集。主要用于手写数字识别图像分类的任务,包括将图像分类为0到9中的一个数字。
MNIST

import torchvision

train_set = torchvision.datasets.MNIST(root='../dataset/mnist',train=True,download=True) 
test_set = torchvision.datasets.MNIST(root='../dataset/mnist',train=False,download=True)
  • train=True/False表示是需要训练集还是测试集

CIFAR10:CIFAR10数据集包含了一组彩色图像,分为十个类别,每个类别有6000个图像,主要用于图像分类任务,要求将图像分类为飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、船和卡车这十个类别之一。
在这里插入图片描述

2.np.linspace

np.linspace是Numpy库中的一个函数,用于在指定的间隔内生成均匀分布的数值。

import numpy as np

x=np.linspace(5,100,20) # 在5到100之间生成20个均匀分布的数值
print(x)
#output:[  5.  10.  15.  20.  25.  30.  35.  40.  45.  50.  55.  60.  65.  70.
#  75.  80.  85.  90.  95. 100.]

3.torch.Tensor(x).view

torch.Tensor(x).view()是将张量进行形状变换的操作,相当于numpy里面的reshape。

import torch

x = torch.tensor([[1, 2, 3], [4, 5, 6]])  # 创建一个2x3的张量
y = x.view(3, 2)  # 将x进行形状变换,得到一个3x2的新张量

print(x)
print(y)

output:
在这里插入图片描述

4.matplotlib画一条直线

import matplotlib.pyplot as plt

plt.plot([0, 10], [0.5, 0.5], c='r')
# [0,10]表示经过的横坐标轴,[0.5,0.5]表示经过的纵坐标轴
# 可以看作x∈[0,10],y=0.5
plt.show()

二、分类问题

1.二分类问题

分类问题与回归问题不同,输出的不再是实数而是一个概率,和我们概率论学的0-1分布类似。
公式如下:p{X=k}= p k p^{k} pk+ ( 1 − p ) 1 − k (1-p)^{1-k} 1p1k
假设k=0为fail,k=1为pass,满足p{k=0}+p{k=1}=1
在这里插入图片描述

x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]]) # 分别表示第0类,第一类

在PyTorch中处理二分类问题的一种常用方式是使用sigmoid激活函数和BCELoss损失函数。
设置一个激活函数将实数映射到0~1
在这里插入图片描述

2.BCELoss函数

BCELoss基于交叉熵损失(Cross Entropy Loss)的概念,适用于二分类问题,其中每个样本只能属于两个类别之一,通过最小化BCELoss损失值来调整模型的参数,使得结果不断精确。
它的计算方式如下:
在这里插入图片描述

3.思路流程

  1. 数据的准备
  2. 设置模型,增加激活函数sigmoid
  3. 构造损失函数和优化器
  4. 写训练循环

三、课程代码

import torch
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 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()

criterion = torch.nn.BCELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

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()

x = np.linspace(0, 10, 200)
x_t = torch.Tensor(x).view((200, 1)) # 变成200×1的矩阵
y_t = model(x_t)
y = y_t.data.numpy() # 将y里面的数据拿出来
plt.plot(x, y)
plt.plot([0, 10], [0.5, 0.5], c='r')
plt.xlabel('Hours')
plt.ylabel('Probability of Pass')
plt.grid()
plt.show()

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

失舵之舟-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值