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

目录

  • 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 nndevice = "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.mzph.cn/pingmian/48240.shtml

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

相关文章

基于A律压缩的PCM脉冲编码调制通信系统simulink建模与仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1A律压缩的原理 4.2 PCM编码过程 4.3 量化噪声与信噪比 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#…

python项目读取oracle数据库方法(cx_Oracle库实现)

目录 创建一个python项目,并配置运行环境 查看oracle对应数据库版本(该标题下内容只是为了查看版本,不用在意) 从oracle官网下载对应版本的oracle客户端 解压下载的压缩包,并获取依赖 将依赖文件导入python项目运…

82. UE5 RPG 实现角色升级系统(下)

书接上回,在上一篇博客里,我们实现了角色升级的基础的功能。给敌人增加的经验奖励配置,并且在敌人死亡时,能够将经验通过事件传递给击杀者,玩家定义了被动技能,在被动技能中接收传递的事件,通过…

iOS 开发包管理之CocoaPods

CocoaPods(Objective-C 时期,支持Objective-C和swift),CocoaPods下载第三方库源代码后会将其编译成静态库.a 文件 或动态库框架.framework 文件 的形式,并将它们添加到项目中,建立依赖关系,这种…

Redis实现用户会话

1.分布式会话 (1)什么是会话 会话Session代表的是客户端与服务器的一次交互过程,这个过程可以是连续也可以是时断时续的。曾经的Servlet时代(jsp),一旦用户与服务端交互,服务器tomcat就会为用户创建一个session&#…

开源PDF解析工具marker 和 MinerU的解析效果对比

RAG中的文档解析需求:需要的是文档的完整段落,标题,图片,表格。我们希望删除的是md格式,或者josn格式。 MinerU 和 maker恰好。都是能够满足此需求的开源工具。这篇文章分享一下对两者的对比。整理出来目前还存在的问题…

RPG素材Unity7月20闪促限时4折游戏开发资产兽人角色模型动画休闲放置模板物理交互流体水下焦散VR界面UI2D模板场景20240720

今天这个是RPG素材比较多,还有一些休闲放置模板、FPS场景素材、角色模型、动画、特效。 详细内容展示:www.bilibili.com/video/BV1Tx4y1s7vm 闪促限时4折:https://prf.hn/l/0eEOG1P 半价促销:https://prf.hn/l/RlDmDeQ 7月闪促…

谷粒商城实战-Vue学习过程中踩坑记录

一&#xff0c;自闭合的<script>标签 第一次使用Vue&#xff0c;按照步骤引入vue.js&#xff0c;创建div&#xff0c;创建Vue对象&#xff0c;但是未达预期效果。 插值表达式{{name}}没被替换为data对象中的属性值。 F12看了下网页源代码&#xff0c;发现创建Vue对象的…

OpenAI突发新模型GPT-4o mini,GPT-3.5退役!

OpenAI突发新模型&#xff0c;全面取代老去的GPT-3.5——GPT-4o mini&#xff01; 免费用户已可使用GPT-4o mini模型。 GPT-4o mini&#xff0c;能力接近原版GPT-4&#xff0c;价格却要便宜一个数量级&#xff1a; GPT-4o mini:每百万输入tokens&#xff0c;15美分&#xff0…

【Node.js基础03】利用http模块创建Web服务

一&#xff1a;使用步骤 1 加载http模块&#xff0c;并创建Web服务程序 2 利用Web服务程序监听request事件&#xff0c;设置响应头和响应体 3 配置端口号并启动Web服务 4 浏览器请求设置的端口号&#xff0c;进行Web服务程序测试 二&#xff1a;简单应用 const http requir…

基于多线程延迟排序的睡眠排序算法的创新与改进

基于多线程延迟排序的睡眠排序算法的创新与改进 摘要 本文在传统睡眠排序算法的基础上&#xff0c;提出了一种改进方案&#xff0c;旨在优化处理负数和大规模数据集的性能。通过引入线程池管理和数据分段排序技术&#xff0c;改进后的算法在处理大数据集和包含负数的数据集时…

计算机网络入门 -- TCP详解

计算机网络入门 – TCP详解 1.TCP协议 1.1 报文格式 1.32位序号&#xff1a;该条TCP数据携带的起始序号。 2.32位确认序号&#xff1a;期望对方发送数据从那个序号开始发送。 3.4位首部长度&#xff1a;最大为0xF(15)&#xff0c;指的是TCP头部长度。 首部长度 4 位首部长…

谷粒商城实战笔记-37-前端基础-Vue-基本语法插件安装

文章目录 一&#xff0c;v-model1&#xff0c;双向绑定2&#xff0c;vue的双向绑定2.1 html元素上使用指令v-model2.2 model中声明对应属性2.3&#xff0c;验证view绑定modelmodel绑定view 完整代码 二&#xff0c;v-on1&#xff0c;指令简介2&#xff0c;在button按钮中添加v-…

rimraf快速删除node_modules方法

项目中&#xff0c;有时候会遇到下载依赖报错&#xff0c;然后想要删除node_modules再重新下载&#xff0c;但是有时候直接用yarn 或者npm install仍热不行&#xff0c;我们可以尽量用yran&#xff0c;因为npm 可能会自动下一些给一些包升级了&#xff0c;此时因为前面已经下过…

JVM:GraalVM

文章目录 一、介绍1、什么是GraalVM&#xff1a;2、GraalVM版本 二、两种使用模式 一、介绍 1、什么是GraalVM&#xff1a; GraalVM是Oracle官方推出的一款高性能JDK&#xff0c;使用它享受比OpenJDK或者OracleJDK更好的性能。GraalVM的官网地址&#xff1a;https://www.graa…

泛型新理解

1.创建三个类&#xff0c;并写好对应关系 package com.jmj.gulimall.study;public class People { }package com.jmj.gulimall.study;public class Student extends People{ }package com.jmj.gulimall.study;public class Teacher extends People{ }2.解释一下这三个方法 pub…

数据结构(稀疏数组)

简介 稀疏数组是一种数据结构&#xff0c;用于有效地存储和处理那些大多数元素都是零或者重复值的数组。在稀疏数组中&#xff0c;只有非零或非重复的元素会被存储&#xff0c;从而节省内存空间。 案例引入 假如想把下面这张表存入文件&#xff0c;我们会怎么做&#xff1f;…

【LeetCode】翻转二叉树

目录 一、题目二、解法完整代码 一、题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root…

php-fpm如何配置max_children参数

前言 略 php-fpm 资源耗尽 php-fpm 的子进程耗尽的时&#xff1a; 会导致 502 出现nginx 出现错误日志 2024/07/18 20:19:10 [crit] 36390#0: *1402471 connect() to unix:/tmp/php-cgi-81.sock failed (2: No such file or directory) while connecting to upstream, cli…

Spring Authorization Server实战

Spring Authorization Server实战 Spring Authorizatin Server Spring Authorizatin Server是一个框架&#xff0c;它提供了OAuth2.1和OpenID Connect 1.0规范以及其它相关规范的实现&#xff0c;它是基于Spring Security构建的 OAuth2.0协议介绍 OAuth是一个开放标准的授权…