news 2026/4/23 11:18:49

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在 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()推理时禁用梯度以提升效率

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 16:48:42

数据编织创新网络:知识图谱如何重塑技术转移的生态新格局

科易网AI技术转移与科技成果转化研究院 在科技创新浪潮奔涌的时代,技术转移作为科技成果转化为现实生产力的关键环节,其效率与质量直接关系到创新生态的活力与协同水平。然而,科技成果转化长期面临供需匹配难、信息不对称、转化路径不清晰等…

作者头像 李华
网站建设 2026/4/23 9:54:57

导师推荐!专科生必用AI论文软件TOP9:开题报告文献综述全测评

导师推荐!专科生必用AI论文软件TOP9:开题报告文献综述全测评 2026年专科生论文写作工具测评:为何要关注AI软件? 随着学术研究的日益深入,论文写作已成为专科生学习过程中不可回避的重要环节。然而,面对开题…

作者头像 李华
网站建设 2026/4/23 9:54:02

Atto 465 NHS Ester,Atto465-NHS,实现高分辨率多通道成像

Atto 465 NHS Ester,Atto465-NHS,实现高分辨率多通道成像Atto 465 NHS Ester(简称Atto465-NHS)是一种高性能荧光活性试剂,由Atto 465荧光染料通过N-羟基琥珀酰亚胺(NHS)酯活化形成的衍生物。Att…

作者头像 李华
网站建设 2026/4/18 13:03:58

【Java毕设源码分享】基于springboot+vue的农产品物流系统的设计与实现(程序+文档+代码讲解+一条龙定制)

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

作者头像 李华
网站建设 2026/4/18 15:59:24

【Java毕设源码分享】基于springboot+vue的农产品研究报告管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

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

作者头像 李华