当前位置: 首页 > news >正文

在 PyTorch 中训练一个简单的神经网络包括以下几个核心步骤:定义模型、准备数据、选择损失函数和优化器、编写训练循环

在 PyTorch 中训练一个简单的神经网络包括以下几个核心步骤:定义模型、准备数据、选择损失函数和优化器、编写训练循环。下面以一个简单的线性回归任务为例,演示完整流程。


✅ 步骤 1:导入必要的库

importtorchimporttorch.nnasnnimporttorch.optimasoptimimportnumpyasnpimportmatplotlib.pyplotasplt

✅ 步骤 2:生成模拟数据

# 真实关系: y = 2x + 1X=np.random.rand(100,1)*10# 输入特征 (100, 1)y=2*X+1+np.random.randn(100,1)*0.1# 加入少量噪声的标签# 转换为 TensorX_tensor=torch.FloatTensor(X)y_tensor=torch.FloatTensor(y)

✅ 步骤 3:定义神经网络模型

classSimpleNN(nn.Module):def__init__(self):super(SimpleNN,self).__init__()self.linear=nn.Linear(1,1)# 一层线性层defforward(self,x):returnself.linear(x)model=SimpleNN()print(model)

输出:

SimpleNN( (linear): Linear(in_features=1, out_features=1, bias=True) )

✅ 步骤 4:定义损失函数和优化器

criterion=nn.MSELoss()# 均方误差损失optimizer=optim.SGD(model.parameters(),lr=0.01)# 随机梯度下降

✅ 步骤 5:训练模型(主循环)

epochs=100forepochinrange(epochs):model.train()# 训练模式optimizer.zero_grad()# 梯度清零# 前向传播outputs=model(X_tensor)loss=criterion(outputs,y_tensor)# 反向传播 + 更新参数loss.backward()optimizer.step()# 打印日志if(epoch+1)%20==0:print(f'Epoch [{epoch+1}/{epochs}], Loss:{loss.item():.6f}')

✅ 步骤 6:查看训练结果

# 提取权重和偏置w=model.linear.weight.item()b=model.linear.bias.item()print(f'\n训练得到的模型: y ={w:.2f}x +{b:.2f}')print('真实模型: y = 2x + 1')

✅ (可选)可视化拟合效果

plt.scatter(X,y,label='真实数据',alpha=0.6)plt.plot(X,w*X+b,color='red',label=f'拟合直线 y={w:.2f}x+{b:.2f}',linewidth=2)plt.legend()plt.title("PyTorch 简单神经网络拟合结果")plt.show()

🧠 小结:关键组件说明

组件作用
nn.Module定义神经网络结构基类
forward()定义前向传播逻辑
nn.Linear全连接层
nn.MSELoss回归任务常用损失函数
optim.SGD优化器,用于更新参数
zero_grad()清除上一步梯度,避免累积

🔁 此流程是所有深度学习任务的基础模板,后续扩展到分类、CNN、RNN 等只需替换模型结构和损失函数即可。

在 PyTorch 中实现一个二分类任务,通常使用带有Sigmoid 激活函数 + 二元交叉熵损失(BCELoss)或直接使用nn.BCEWithLogitsLoss(推荐),它将 Sigmoid 和损失计算合并,更稳定。

下面是一个完整的示例:用简单神经网络对二维数据进行二分类。


✅ 步骤 1:导入所需库

importtorchimporttorch.nnasnnimporttorch.optimasoptimimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.datasetsimportmake_circles

✅ 步骤 2:生成二分类数据(同心圆)

# 使用 scikit-learn 生成非线性可分的二分类数据X,y=make_circles(n_samples=400,noise=0.05,factor=0.5,random_state=42)# 转换为 TensorX_tensor=torch.FloatTensor(X)y_tensor=torch.FloatTensor(y).view(-1,1)# reshape 为列向量

✅ 步骤 3:定义模型(单层全连接网络)

classBinaryClassifier(nn.Module):def__init__(self):super(BinaryClassifier,self).__init__()self.model=nn.Sequential(nn.Linear(2,16),# 输入维度 2 (x1, x2)nn.ReLU(),nn.Linear(16,1),# 输出 1 维 logit# 不加 Sigmoid,因为 loss 会包含)defforward(self,x):returnself.model(x)model=BinaryClassifier()

🔁 注意:我们不显式添加 Sigmoid,而是使用nn.BCEWithLogitsLoss,它内部自动处理。


✅ 步骤 4:定义损失函数和优化器

criterion=nn.BCEWithLogitsLoss()# 包含 sigmoid 的二元交叉熵optimizer=optim.Adam(model.parameters(),lr=0.01)

✅ 步骤 5:训练循环

epochs=1000forepochinrange(epochs):model.train()optimizer.zero_grad()# 前向传播outputs=model(X_tensor)# 输出是 logitsloss=criterion(outputs,y_tensor)# 反向传播loss.backward()optimizer.step()# 打印日志if(epoch+1)%200==0:print(f'Epoch [{epoch+1}/{epochs}], Loss:{loss.item():.6f}')

✅ 步骤 6:评估与可视化

model.eval()withtorch.no_grad():y_pred_logits=model(X_tensor)y_pred=torch.sigmoid(y_pred_logits)# 转换为概率y_pred_class=(y_pred>0.5).float()# 阈值化为 0/1accuracy=(y_pred_class.eq(y_tensor).sum().item())/len(y_tensor)print(f'\n准确率:{accuracy*100:.2f}%')

✅ (可选)绘制决策边界

h=0.01x_min,x_max=X[:,0].min()-1,X[:,0].max()+1y_min,y_max=X[:,1].min()-1,X[:,1].max()+1xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))grid_tensor=torch.FloatTensor(np.c_[xx.ravel(),yy.ravel()])withtorch.no_grad():Z_logits=model(grid_tensor)Z_prob=torch.sigmoid(Z_logits)Z=(Z_prob>0.5).numpy()Z=Z.reshape(xx.shape)plt.contourf(xx,yy,Z,alpha=0.4,cmap=plt.cm.RdYlBu)plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.RdYlBu,edgecolors='k')plt.title("PyTorch 二分类决策边界")plt.show()

🧠 关键点总结

技术说明
nn.BCEWithLogitsLoss()推荐用于二分类,数值更稳定
torch.sigmoid()将输出转为 [0,1] 概率
(prob > 0.5).float()获得预测类别
torch.no_grad()推理时禁用梯度以提升效率

http://www.jsqmd.com/news/243730/

相关文章:

  • 协议十年演进
  • 硬核解析:英伟达机器人的技术内核与落地场景全攻略硬核解析:英伟达机器人的技术内核与落地场景全攻略
  • ZYNQ MPSOC VCU介绍
  • Go(又称Golang)是一种由Google开发的静态类型、编译型编程语言,设计初衷是解决大规模软件工程中的效率与协作问题
  • 监控十年演进
  • 如何测试生成式AI?ChatGPT类应用的质量保障
  • 人工智能应用-机器视觉:车牌识别(5)
  • 孤胆枪手下载安装教程(2026 最新版)|下载 + 安装 + 运行配置全流程图文详解
  • 人工智能应用-机器视觉:车牌识别(6)
  • Vidu 的短剧制作能力分析
  • 数据编织创新脉络:知识图谱在科技成果转化中的应用与价值探索
  • 【挖掘Windows这三个隐藏工具】
  • ThreadX的CMSIS-RTOS V2封装层升级至V1.4.0(2026-01-14)
  • 6个最好实践指导您快速部署YashanDB
  • 阿西米尼Asciminib治疗慢性髓系白血病的深度分子学反应与疗程依赖性分析
  • 机器人质量与成本控制十年演进
  • 7大关键因素保障YashanDB数据库的稳定性
  • 2026短剧业务研判
  • 7大关键指标评估YashanDB性能表现与资源优化策略
  • 数据编织创新网络:知识图谱如何重塑技术转移的生态新格局
  • 机器人质量控制十年演进
  • 当跨链协议开始将业务从「搭桥」拓展至「swap」
  • 7个步骤构建基于YashanDB的强大应用程序
  • 机器人成本控制十年演进
  • 重磅!Volcano发布AgentCube,构建AI Agent时代的云原生基础设施
  • 架构师觉醒:从重构到引领-第2集:画布上的第一笔:架构图重构
  • 机器人技术十年演进
  • 7个关键问题解密YashanDB数据库的技术架构
  • GD25Q64EWIGR,支持标准、双通道及四通道SPI的高速64M位串行闪存
  • Spring Boot MyBatis-Plus处理日期查询代码报错分析与修复