news 2026/4/18 11:07:26

PyTorch实现二分类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PyTorch实现二分类

二分类问题的实现方法,核心是把线性回归的 “连续值输出” 改成 “0/1 类别概率输出”。最基础常用的二分类模型基于逻辑回归(Logistic Regression)。

线性回归实现方式:PyTorch实现线性回归-CSDN博客

二分类本质上也是一种回归(Regression)问题,在上述线性回归的基础上修改就可以实现。下面是线性回归与二分类任务的差异:

环节线性回归(回归任务)二分类(分类任务)
输出目标连续数值(如 y=2x 的预测值)0/1 类别概率(0≤P≤1)
核心激活函数无(直接输出线性结果)Sigmoid(把线性输出映射到 0-1)
损失函数MSELoss(均方误差)BCELoss(二元交叉熵损失)
预测逻辑直接取输出值概率 > 0.5 归为 1 类,≤0.5 归为 0 类

1. 准备数据集(Prepare Dataset)

对比线性回归,数据格式还是 Tensor,但标签y_data是0/1 离散值,这是分类任务的核心特征。

import torch # 构造数据集:特征x(学分),标签y(0=不及格,1=及格) # 样本:[1.0], [2.0], [3.0] → 标签:0,0,1 x_data = torch.Tensor([[1.0], [2.0], [3.0]]) y_data = torch.Tensor([[0], [0], [1]])

2. 设计模型(Design model)

class LogisticRegressionModel(torch.nn.Module): def __init__(self): super().__init__() self.linear = torch.nn.Linear(1, 1) def forward(self, x): # 核心:线性输出 + Sigmoid激活 → 映射到0-1概率 y_pred = torch.sigmoid(self.linear(x)) return y_pred model = LogisticRegressionModel()
  • Sigmoid函数公式:
  • forward中增加torch.sigmoid()把线性层的 “任意实数输出” 压缩到0~1 区间,这个值就是 “样本属于 1 类的概率”。

3. 构造损失函数(Construct Loss)

criterion = nn.BCELoss(reduction='sum')
  • BCELoss:二元交叉熵损失,是二分类的专用损失。

关于二元交叉熵损失函数的介绍,参考文章PyTorch_conda-CSDN博客中《nn.BCELoss(二元交叉熵损失)》一节。

4. 构造优化器(Construct Optimizer)

optimizer = torch.optim.SGD(model.parameters(), lr=0.0001)

5. 训练循环(Training Cycle)

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() # 更新参数

完整实例

import torch import torch.nn as nn x_data = torch.Tensor([[1.0], [2.0], [3.0]]) y_data = torch.Tensor([[0], [0], [1]]) class LogisticRegressionModel(nn.Module): def __init__(self): super().__init__() self.linear = nn.Linear(1, 1) def forward(self, x): return torch.sigmoid(self.linear(x)) model = LogisticRegressionModel() criterion = nn.BCELoss(reduction='sum') optimizer = torch.optim.SGD(model.parameters(), lr=0.01) for epoch in range(10000): y_pred = model(x_data) loss = criterion(y_pred, y_data) if epoch % 1000 == 0: print(f"Epoch: {epoch}, Loss: {loss.item():.4f}") optimizer.zero_grad() loss.backward() optimizer.step() x_test = torch.Tensor([[4.0]]) y_test_pred = model(x_test) print("\n测试结果:") print('y_pred = ', y_test_pred.data) # 查看模型参数 print(f"\n模型权重:{model.linear.weight.item():.6f}") print(f"模型偏置:{model.linear.bias.item():.6f}")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 21:24:53

【计算机毕业设计案例】基于springboot+小程序的家校通程序设计与实现教师发布作业、通知等信息,家长和学生查看信息并与教师互动(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/17 18:25:21

小程序毕设选题推荐:基于springboot+小程序的高校校园信息交流平台小程序基于微信小程序的校园信息交流平台【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/17 7:11:07

(100分)- 打印机队列(Java JS Python)

(100分)- 打印机队列(Java & JS & Python)题目描述有5台打印机打印文件,每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中数字越大优先级越高。打印…

作者头像 李华
网站建设 2026/4/17 14:46:30

(100分)- 等和子数组最小和(Java JS Python)

(100分)- 等和子数组最小和(Java & JS & Python)题目描述给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。输入描述第一行输入 m 接着输入m个数…

作者头像 李华
网站建设 2026/4/17 15:22:29

(100分)- 端口合并(Java JS Python)

(100分)- 端口合并&#xff08;Java & JS & Python&#xff09;题目描述有M个端口组(1<M<10)&#xff0c; 每个端口组是长度为N的整数数组(1<N<100)&#xff0c; 如果端口组间存在2个及以上不同端口相同&#xff0c;则认为这2个端口组互相关联&#xff0c;…

作者头像 李华
网站建设 2026/4/17 20:05:02

《深入理解Java虚拟机》| 运行时数据区与OOM异常

摘要&#xff1a;本文系统解析《深入理解Java虚拟机》中的运行时数据区与OOM异常&#xff0c;包括程序计数器、虚拟机栈、堆内存、方法区与直接内存&#xff0c;同时讲解OOM异常等解决方案。 书摘内容 运行时数据区域 运行时数据区是 JVM 的内存核心&#xff0c;分为线程共享区…

作者头像 李华