news 2026/6/10 6:42:05

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/5/31 9:58:05

《P3168 [CQOI2015] 任务查询系统》

题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分。 超级计算机中的任务用三元组 (si​,ei​,pi​) 描述,(si​,ei​,pi​) 表示任务从第 si​ 秒开始,在第 ei​ 秒后结束(第 si…

作者头像 李华
网站建设 2026/6/5 6:44:41

【计算机毕业设计案例】基于springboot+vue的微信小程序的智慧校园平台基于springboot+小程序的高校校园信息交流平台小程序设计与实现(程序+文档+讲解+定制)

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

作者头像 李华
网站建设 2026/6/6 10:12:08

小程序毕设选题推荐:基于Springboot+Uniapp的家校通平台微信小程序设计与实现基于springboot+小程序的家校通程序设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华
网站建设 2026/5/30 19:29:51

【课程设计/毕业设计】基于SpringBoot校园生活服务小程序基于springboot+小程序的高校生活互助平台小程序【附源码、数据库、万字文档】

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

作者头像 李华
网站建设 2026/6/5 6:11:42

leetcode 923. 3Sum With Multiplicity 三数之和的多种可能

Problem: 923. 3Sum With Multiplicity 三数之和的多种可能 排序,哈希表记录每个数字的频次,双循环,拿到两个数字,最后一个数字相减得到,然后通过排列组合计算答案,需要考虑是否存在这样的情况,…

作者头像 李华