新手小白的pytorch学习第七弹------分类问题模型

news2024/9/22 17:35:57

目录

  • 1. 准备分类数据
    • 1.1 输入和输出的形状 shape
    • 1.2 将数据转换为张量,同时将我们的数据集转换为训练集和测试集
  • 2 创建模型
      • 方法一:自定义+forward()
      • 方法二:nn.Sequential()
      • 方法三:自定义+forward()+nn.Sequential()

用 pytorch 使用神经网络进行分类

  1. 二分类问题:比如说收到一个邮件,判断这个邮件是不是垃圾邮件,那么这里就是二分类,是或者不是
  2. 多类分类问题:比如说我给你一张图片,你判断它是蛋糕、牛排或者寿司
  3. 多标签分类问题:它的目标不止一个选项,比如一个文件的标签可以是数学、科学、哲学等等,意味着它的标签有多个

分类问题就是给一些输入然后预测这类别属于哪个类

我们接下来要做的事情:

  1. 准备好二分类数据
  2. 创建pytorch分类模型
  3. 训练模型
  4. 预测并评估
  5. 提升模型性能
  6. 非线性
  7. 复制非线性函数
  8. 全部整合在一起

今天我们就暂时先搞两个

  1. 准备好二分类数据
  2. 创建pytorch分类模型

1. 准备分类数据

这里我们使用的是Scikit-Learn里面的make_circles()方法,生成两个不同颜色的圆圈

# 制作数据
from sklearn.datasets import make_circles

# 创建1000个样本
n_samples = 1000

# 创建我们的圆圈样本
X, y = make_circles(n_samples,
                    noise=0.03, # 每个点的噪声
                    random_state=42) # 保证我们获得相同的值

在这里插入图片描述
报错了,没有sklearn模块

pip install scikit-learn

ok,咱们安装一下应该就没有问题啦!
现在让我们来看看Xy的前五个值

print(f"First 5 X features:\n{X[:5]}")
print(f"first 5 y features:\n{y[:5]}")

First 5 X features:
[[ 0.75424625 0.23148074]
[-0.75615888 0.15325888]
[-0.81539193 0.17328203]
[-0.39373073 0.69288277]
[ 0.44220765 -0.89672343]]
first 5 y features:
[1 1 1 1 0]

这里我们可以看出,它是两个X对应一个y值
接下来让我们可视化一下,这样有助于我们更好的理解数据

# 将我们的圆圈数据转换为 DataFrame 格式的
import pandas as pd
circles = pd.DataFrame({"X1":X[:,0],
                        "X2":X[:,1],
                        "label":y
                    })
circles.head(10)

在这里插入图片描述
报错:没有pandas模块
没事哒~没事哒,我们安装一下就可以啦!

pip install pandas

接着再运行代码就出现下面这个结果啦。
在这里插入图片描述
从上面展示的数据,咱们可以看出它是一个二分类问题,因为y值只有0或1的选项,所以让我们接着看一下每一个类别有多少数据呢

circles.label.value_counts()

label
1 500
0 500
Name: count, dtype: int64

绘制数据circle的图像

import matplotlib.pyplot as plt
plt.scatter(x=X[:,0],
            y=X[:,1],
            c=y,
            cmap=plt.cm.RdYlBu)

在这里插入图片描述
接下来看我们怎样创建一个模型,它能够很好的将点分为 0(red), 1(blue)

1.1 输入和输出的形状 shape

# 首先,查看我们输入和输出数据的 shape
X.shape, y.shape

((1000, 2), (1000,))

# 让我们看一下第一个数据
X_sample = X[0]
y_sample = y[0]
print(f"第一个数据的X值:{X_sample},第一个数据的y值:{y_sample}")
print(f"第一个数据的shape值: X_sample shape{X_sample.shape}, y_sample shape{y_sample.shape}")

第一个数据的X值:[0.75424625 0.23148074],第一个数据的y值:1
第一个数据的shape值: X_sample shape(2,), y_sample shape()

这个结果告诉我们一个X特征是由两个值组成的向量,而y他就是一个值的标量,即我们有两个输入一个输出

1.2 将数据转换为张量,同时将我们的数据集转换为训练集和测试集

# 将数据转换为张量,并将数据转换为默认数据格式
import torch
X = torch.from_numpy(X).type(torch.float)
y = torch.from_numpy(y).type(torch.float)

# 查看一下前五个样本
X[:5],y[:5]

(tensor([[ 0.7542, 0.2315],
[-0.7562, 0.1533],
[-0.8154, 0.1733],
[-0.3937, 0.6929],
[ 0.4422, -0.8967]]),
tensor([1., 1., 1., 1., 0.]))

这里我们划分训练集和测试集不是使用原来那个切分了,使用的是Scikit-Learn中的train_test_split()方法

# 划分数据为训练集和测试集
from sklearn.model_selection import train_test_split

# test_size=0.2 是说测试数据占数据的20%,因为这个方法是随机划分的,因此我们这里设置了random_state=42,这样就有助于我们复现代码
X_train, X_test, y_train, y_test = train_test_split(X,
                                                    y, 
                                                    test_size=0.2,
                                                    random_state=42)
len(X_train), len(y_train), len(X_test), len(y_test)

(800, 800, 200, 200)

这个数据就对啦,之前我们不是1000条数据嘛,训练集占80%,测试集占20%,这个数据划分非常之合理和正确。

2 创建模型

准备好数据,我们就可以创建我们的模型啦!

我们将创建模型也划分几个步骤,这样思路能够更加清晰一些:
1.设备无关的代码
2.创建一个模型(nn.Module的子类)
3.定义损失函数和优化器
4.创建训练循环(下个文档学习昂,别着急)

准备好了吗?Let’s start right now!

import torch.nn as nn

device = "cuda" if torch.cuda.is_available() else "cpu"
device

‘cuda’

方法一:自定义+forward()

# 创建模型类,并且是 nn.Module 的子类
class CircleClassificationV0(nn.Module):
    def __init__(self):
        super().__init__()
        # 创建两个线性层
        self.liear1 = nn.Linear(in_features=2, out_features=5)
        self.liear2 = nn.Linear(in_features=5, out_features=1)
        
    def forward(self, x):
        return self.liear2(self.liear1(x))

这里有一个点就是要搞清楚这个输入和输出特征的值,即 in_features 和 out_features,之前我们讨论过输入X是2,输出y是1,所以不难理解linear1的in_features=2, 和linear2的out_features=1,注意linear1的out_features和linear2的in_features一定是一样的,因为linear1的out_features是linear2的输入,这个值是自己定的,这里选择5是因为方便我们观察数据,并了解里面的原理。

# 实例化模型,并把它送到目标设备上
model_0 = CircleClassificationV0().to(device)
model_0

CircleClassificationV0(
(liear1): Linear(in_features=2, out_features=5, bias=True)
(liear2): Linear(in_features=5, out_features=1, bias=True)
)

这里还有一个方法,nn.Sequential()构建模型,看起来代码更加简洁

方法二:nn.Sequential()

# 使用 nn.Sequential() 构建模型
model_0 = nn.Sequential(
    nn.Linear(in_features=1, out_features=5),
    nn.Linear(in_features=5, out_features=1)
).to(device)
model_0

Sequential(
(0): Linear(in_features=1, out_features=5, bias=True)
(1): Linear(in_features=5, out_features=1, bias=True)
)

这段代码会重写上面的代码,同时注意这里nn.Sequential()里面的方法都是顺序执行的,并且我们不需要写forward()方法,下面还有一种两个方法结合的,可以看看。

方法三:自定义+forward()+nn.Sequential()

class CircleClassificationV1(nn.Module):
    def __init__(self):
        super().__init__()
        
        self.linear = nn.Sequential(
            nn.Linear(in_features=2, out_features=5),
            nn.Linear(in_features=5, out_features=1)
        )
        
    def forward(self, x):
        return self.linear(x)
    
model_0 = CircleClassificationV1().to(device)
model_0

CircleClassificationV1(
(linear): Sequential(
(0): Linear(in_features=2, out_features=5, bias=True)
(1): Linear(in_features=5, out_features=1, bias=True)
)
)

这种结合两种方法的都可以使用,按照需求自己选择吧,这里我们还是采用第一种哈,再运行一遍之前的代码就可以啦,这里就不复制粘贴啦。

ok,现在我们有一个模型了,让我们看看当我们传递数据给它会发生什么

# 使用模型进行预测
untrained_preds = model_0(X_test.to(device))
print(f"Length of predictions:{len(untrained_preds)},shape:{untrained_preds.shape}")
print(f"Length of test samples:{len(y_test)}, shape:{y_test.shape}")
print(f"\nFirst 10 predictions:\n{untrained_preds[:10]}")
print(f"\nFirst 10 test labels:\n{y[:10]}")

Length of predictions:200,shape:torch.Size([200, 1])
Length of test samples:200, shape:torch.Size([200])

First 10 predictions:
tensor([[0.8031],
[0.8345],
[0.6306],
[0.8524],
[0.4873],
[0.5075],
[0.7094],
[0.6325],
[0.6370],
[0.8350]], device=‘cuda:0’, grad_fn=)

First 10 test labels:
tensor([1., 1., 1., 1., 0., 1., 1., 1., 1., 0.])

ok, 昨天就学到这里了,今天把昨天欠的账终于还了,长舒一口气
BB,我跟你说,昨天吃的绿豆饼尊嘟超级好吃,今天早上的粉丝包没有昨天的好吃,干巴得很。我棒不棒,我把目录加上了,上次说要加,这次马上就加了。
BB,如果我的文档对您有用得话,记得给俺点个赞赞

靴靴,谢谢啦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1938652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Leetcode】十六、深度优先搜索 宽度优先搜索 :二叉树的层序遍历

文章目录 1、深度优先搜索算法2、宽度优先搜索算法3、leetcode102:二叉树的层序遍历4、leetcode107:二叉树的层序遍历II5、leetcode938:二叉搜索树的范围和 1、深度优先搜索算法 深度优先搜索,即DFS,从root节点开始&a…

Cadence23学习笔记(七)

三种信号联通的方式: 如何旋转元器件:先像下图一样选中器件,之后按住快捷键R即可旋转: 设置栅格大小: 这里的栅格数值越大,格点越密集。 放置分页符号: cadence中分页的话必须放置分页符&#…

充电站新主流——分体式直流充电桩

在全球对可持续发展和环境保护的高度关注下,电动汽车市场的迅猛增长催生了对充电设施建设的迫切需求。为此,一种名为分体式充电桩的创新充电设备应运而生,以其卓越的性能和独特优势,预示着未来充电技术的新趋势。为了增进公众对分…

PY32F002B单片机 ISP 串口下载注意事项

一、PY32F002B ISP 串口下载的连接方式 仿真上的 VCC 和 GND 连接到 MCU 的 VCC 和 VSS, 仿真的 TX 接 MCU 的 RX,RX 接 MCU 的 TX。 二、因为 PY32F002B 没有 BOOT,需要用 ISP 串口下载的话需要下载串口引导程序。 下载这个目录下的 IAP…

FPGA实验1:简单逻辑电路

一、实验目的及要求 学习Create-SOPC实验平台的使用方法;熟悉Quartus II 软件平台和使用 VHDL 语言设计电路的方法;学习简单逻辑电路的设计、仿真和硬件测试。 二、实验原理 运用Quartus II 集成环境下的VHDL文本设计方法设计半加器,进行波…

摸鱼大数据——Spark Structured Steaming——物联网数据分析案例

1、数据模拟器代码 1- 创建一个topic, 放置后续物联网的数据 search-log-topic ./kafka-topics.sh --bootstrap-server node1.itcast.cn:9092,node2.itcast.cn:9092 --create --topic search-log-topic --partitions 3 --replication-factor 2 2- 将代码放置到项目中: import…

浅谈芯片验证中的仿真运行之 timescale (五)提防陷阱

一 仿真单位 timeunit 我们知道,当我们的代码中写清楚延时语句时,若不指定时间单位,则使用此单位; 例如: `timescale 1ns/1ps 则 #15 语句表示delay15ns; 例:如下代码,module a 的timescale是1ns/1ps, module b 是1ps/1ps; module b中的clk,频率是由输入参…

【LeetCode】222. 完全二叉树的个数

什么是计算机基础?如果本题能够用二分二进制二叉树的方式解出本题,那么我可以认为你的计算机基础就很好了。很久以来,我一直认为自己的计算机基础好,但是自刷题以来,跟网上这么多优秀的同学相比,我发现我实…

vxe-grid 实现配置式form搜索条件 form搜索条件框可折叠 配置式table

文章目录 效果图代码 效果图 代码 <template><div class"app-container"><vxe-grid refxGrid v-bind"gridOptions" v-if"tableHeight" :height"tableHeight"><template #billDate"{ data }"><e…

FPGA实验5:4位加法计数器

实验目的及要求 掌握时钟信号、进程和BUFFER端口的运用&#xff1b;了解计数器的设计、仿真和硬件测试&#xff0c;进一步熟悉VHDL语句、语法及应用等。 实验原理 运用Quartus II 集成环境下的VHDL文本设计方法设计4位加法计数器&#xff0c;进行波形仿真和分析、引脚分配…

【Apache Doris】周FAQ集锦:第 15 期

【Apache Doris】周FAQ集锦&#xff1a;第 15 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户…

从数据湖到湖仓一体:统一数据架构演进之路

文章目录 一、前言二、什么是湖仓一体&#xff1f;起源概述 三、为什么要构建湖仓一体&#xff1f;1. 成本角度2. 技术角度 四、湖仓一体实践过程阶段一&#xff1a;摸索阶段(仓、湖并行建设)阶段二&#xff1a;发展阶段方式一、湖上建仓(湖在下、仓在上)方式二&#xff1a;仓外…

一种优雅的方法获取PyInstaller打包Python程序的资源路径和目录路径

1、需求分析 运行Python程序的时候需要获取的资源有2种&#xff1a; 一种是固定的资源文件&#xff0c;你希望启动程序的时候可以调用的&#xff0c;比如数据库文件和图片资源文件&#xff1b;另一种是用于存储历史记录的文件&#xff0c;你希望每次打开都会改变其中的内容&am…

【机器学习】智能驱动未来:机器学习在能源效率提升与环境管理中的创新应用

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习能源环境领域的应用潜力&#x1f304;能源效率提升&#x1f3de;️环境管理⛰️具体案例…

动漫风格动漫404网站维护HTML源码

源码介绍 动漫风格动漫404网站维护HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 效果预览 源码下载 动漫风格动漫404网站维护HTML源码

收银系统源码-千呼新零售收银视频介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

XMl基本操作

引言 使⽤Mybatis的注解⽅式&#xff0c;主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能&#xff0c;建议使⽤XML来配置映射语句&#xff0c;也就是将SQL语句写在XML配置⽂件中. 之前&#xff0c;我们学习了&#xff0c;用注解的方式来实现MyBatis 接下来我们…

传输层和网络层的关系,ip协议+ip地址+ip报头字段介绍(4位TOP字段,8位生存时间(ttl)),ip地址和端口号的作用

目录 传输层和网络层的关系 引入 介绍 ip协议 介绍 ip地址 引入 数据传递过程 举例(ip地址的作用) ip报头 格式 4位版本号 ip地址不足的问题 8位服务类型 4位TOP(type of service)字段 最小延时 最大吞吐量 4位首部长度 16位总长度 8位协议号 首部校验和…

科研绘图系列:R语言分割小提琴图(Split-violin)

介绍 分割小提琴图(Split-violin plot)是一种数据可视化工具,它结合了小提琴图(violin plot)和箱线图(box plot)的特点。小提琴图是一种展示数据分布的图形,它通过在箱线图的两侧添加曲线来表示数据的密度分布,曲线的宽度表示数据点的密度。而分割小提琴图则是将小提…

LeNet实验 四分类 与 四分类变为多个二分类

目录 1. 划分二分类 2. 训练独立的二分类模型 3. 二分类预测结果代码 4. 二分类预测结果 5 改进训练模型 6 优化后 预测结果代码 7 优化后预测结果 8 训练四分类模型 9 预测结果代码 10 四分类结果识别 1. 划分二分类 可以根据不同的类别进行多个划分&#xff0c;以…