news 2026/6/23 17:37:40

pythonstudy Day37

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
pythonstudy Day37

MLP神经网络的训练

PyTorch的安装

我们后续完成深度学习项目中,主要使用的包为pytorch,所以需要安装,你需要去配置一个新的环境。

未来在复现具体项目时候,新环境命名最好是python版本_pytorch版本_cuda版本,例如 py3.10_pytorch2.0_cuda12.2 ,因为复杂项目对运行环境有要求,所以需要安装对应版本的包。

我们目前主要不用这么严格,先创建一个命名为DL的新环境即可,也可以沿用之前的环境

conda create -n DL python=3.8 conda env list conda activate DL conda install jupyter (如果conda无法安装jupyter就参考环境配置文档的pip安装方法) pip insatll scikit-learn 然后对着下列教程安装pytorch

深度学习主要是简单的并行计算,所以gpu优势更大,简单的计算cpu发挥不出来他的价值,我们之前说过显卡和cpu的区别:

  1. cpu是1个博士生,能够完成复杂的计算,串行能力强。
  2. gpu是100个小学生,能够完成简单的计算,人多计算的快。

这里的gpu指的是英伟达的显卡,它支持cuda可以提高并行计算的能力。

如果你是amd的显卡、苹果的电脑,那样就不需要安装cuda了,直接安装pytorch-gpu版本即可。cuda只支持nvidia的显卡。

安装教程

或者去b站随便搜个pytorch安装视频。

  1. 怕麻烦直接安装cpu版本的pytorch,跑通了用云服务器版本的pytorch-gpu
  2. gpu的pytorch还需要额外安装cuda cudnn组件
import torch torch.cuda

import torch # 检查CUDA是否可用iftorch.cuda.is_available():print("CUDA可用!")# 获取可用的CUDA设备数量 device_count=torch.cuda.device_count()print(f"可用的CUDA设备数量: {device_count}")# 获取当前使用的CUDA设备索引 current_device=torch.cuda.current_device()print(f"当前使用的CUDA设备索引: {current_device}")# 获取当前CUDA设备的名称 device_name=torch.cuda.get_device_name(current_device)print(f"当前CUDA设备的名称: {device_name}")# 获取CUDA版本 cuda_version=torch.version.cudaprint(f"CUDA版本: {cuda_version}")else:print("CUDA不可用。")

数据的准备

# 仍然用4特征,3分类的鸢尾花数据集作为我们今天的数据集 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import numpy as np # 加载鸢尾花数据集 iris=load_iris()X=iris.data # 特征数据 y=iris.target # 标签数据 # 划分训练集和测试集 X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)# 打印下尺寸print(X_train.shape)print(y_train.shape)print(X_test.shape)print(y_test.shape)

# 归一化数据,神经网络对于输入数据的尺寸敏感,归一化是最常见的处理方式 from sklearn.preprocessing import MinMaxScaler scaler=MinMaxScaler()X_train=scaler.fit_transform(X_train)X_test=scaler.transform(X_test)#确保训练集和测试集是相同的缩放
# 将数据转换为 PyTorch 张量,因为 PyTorch 使用张量进行训练 # y_train和y_test是整数,所以需要转化为long类型,如果是float32,会输出1.00.0X_train=torch.FloatTensor(X_train)y_train=torch.LongTensor(y_train)X_test=torch.FloatTensor(X_test)y_test=torch.LongTensor(y_test)

模型架构定义

定义一个简单的全连接神经网络模型,包含一个输入层、一个隐藏层和一个输出层。

定义层数+定义前向传播顺序

import torch import torch.nn as nn import torch.optim as optim
classMLP(nn.Module):# 定义一个多层感知机(MLP)模型,继承父类nn.Module def__init__(self):# 初始化函数super(MLP,self).__init__()# 调用父类的初始化函数 # 前三行是八股文,后面的是自定义的 self.fc1=nn.Linear(4,10)# 输入层到隐藏层 self.relu=nn.ReLU()self.fc2=nn.Linear(10,3)# 隐藏层到输出层 # 输出层不需要激活函数,因为后面会用到交叉熵函数cross_entropy,交叉熵函数内部有softmax函数,会把输出转化为概率 defforward(self,x):out=self.fc1(x)out=self.relu(out)out=self.fc2(out)returnout # 实例化模型 model=MLP()

其实模型层的写法有很多,relu也可以不写,在后面前向传播的时候计算下即可,因为relu其实不算一个层,只是个计算而已。

模型训练(CPU版本)

定义损失函数和优化器

# 分类问题使用交叉熵损失函数 criterion=nn.CrossEntropyLoss()# 使用随机梯度下降优化器 optimizer=optim.SGD(model.parameters(),lr=0.01)# # 使用自适应学习率的化器 # optimizer=optim.Adam(model.parameters(),lr=0.001)

开始循环训练

实际上在训练的时候,可以同时观察每个epoch训练完后测试集的表现:测试集的loss和准确度

# 训练模型 num_epochs=20000# 训练的轮数 # 用于存储每个 epoch 的损失值 losses=[]forepochinrange(num_epochs):# range是从0开始,所以epoch是从0开始 # 前向传播 outputs=model.forward(X_train)# 显式调用forward函数 # outputs=model(X_train)# 常见写法隐式调用forward函数,其实是用了model类的__call__方法 loss=criterion(outputs,y_train)# output是模型预测值,y_train是真实标签 # 反向传播和优化 optimizer.zero_grad()#梯度清零,因为PyTorch会累积梯度,所以每次迭代需要清零,梯度累计是那种小的bitchsize模拟大的bitchsize loss.backward()# 反向传播计算梯度 optimizer.step()# 更新参数 # 记录损失值 losses.append(loss.item())# 打印训练信息if(epoch+1)%100==0:# range是从0开始,所以epoch+1是从当前epoch开始,每100个epoch打印一次print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

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

Linly-Talker结合RAG技术实现知识增强型虚拟客服系统

Linly-Talker结合RAG技术实现知识增强型虚拟客服系统 在银行的智能柜台前,一位老人轻声问:“我这个月养老金涨了多少?”屏幕中的虚拟柜员微微一笑,眼神温和地回应:“根据您所在城市的最新政策,2024年起基础…

作者头像 李华
网站建设 2026/6/23 19:34:11

用Deepseek-v3.1在Trae中编写AI中继程序

用 Deepseek-v3.1 在 Trae 中构建 AI 中继服务:打通国产大模型与 OpenAI 生态的桥梁 在本地开发中,我们常遇到这样一个问题:许多优秀的国产大模型(如百度飞桨星河社区部署的 ERNIE 系列)虽然性能强劲、中文理解出色&a…

作者头像 李华
网站建设 2026/6/22 23:04:46

LobeChat能否实现思维导图输出?结构化内容展示尝试

LobeChat能否实现思维导图输出?结构化内容展示尝试 在AI助手逐渐从“问答工具”演变为“认知协作者”的今天,用户不再满足于一串流水线式的文本回复。他们希望看到逻辑清晰的框架、层次分明的知识体系,甚至是可交互的图表——尤其是在处理复杂…

作者头像 李华
网站建设 2026/6/22 23:13:35

开源5G基站硬件参数

威武纪 高集成RFMC7000模块 SDR软件无线电 AD9371 FMC子卡和拓展卡pcie 300MHz~6GHz频段 SDR 开发评估发射接收卡 双通道收发链路 智邮开源 5G通信验证 射频板卡 OXG-SDR4100 软件无线电 SDR开发板 搭载两颗AD9371 开源5G基站OAI pcie 4路发射 4路接收 300MHz~6GHz …

作者头像 李华
网站建设 2026/6/22 19:16:02

C#开发桌面应用调用GPT-SoVITS REST API实战

C# 桌面应用集成 GPT-SoVITS 实现个性化语音合成实战 在当前 AI 技术快速落地的背景下,语音合成已不再是科研实验室里的“黑箱”技术。越来越多开发者希望将高质量的 TTS 能力嵌入到本地工具中——尤其是那些需要离线运行、保护隐私或具备图形化操作界面的应用场景。…

作者头像 李华
网站建设 2026/6/22 22:17:51

Dify Docker部署与使用全指南

Dify Docker部署与使用全指南 在生成式AI迅速渗透各行各业的今天,越来越多企业希望快速构建专属的智能应用——无论是自动回复客户咨询的客服机器人,还是能批量生成营销文案的内容引擎。但直接基于大模型从零开发,往往面临工程复杂、迭代缓慢…

作者头像 李华