不用PyTorch从零实现MLP训练教程(非常详细),深度学习从入门到精通,收藏这一篇就够了!

PyTorch入门(二)搭建MLP模型实现分类任务 本文将会介绍如何使用PyTorch来搭建简单的MLP(Multi-layer Perceptron,多层感知机)模型,来实现二分类及多分类任务。 阅读详情

百行代码实现mini版深度学习训练框架。该框架支持自动梯度求解:末端的tensor触发backward() 后自动完成计算图上所有tensor的梯度计算与更新。框架支持定义MLP模型,实现二分类训练:

这个目标看着有点难,但了解运算原理后会觉得自动梯度求解实现并不复杂。参考[1]的知识内容,用notebook实现一个简单的深度学习框架,并走通了MLP训练的全流程。

代码地址:mini_dl_framework.ipynb[2]

接下来,一步一步操作:

1 实现支持自动梯度的Tensor类

网络的基本要素:数据(tensor)、操作/公式(ops)、计算图(graph)。

看一个简单的线性神经网络的例子。如下图所示,所有神经元都在进行y=Wx运算,其中W为权重。权重由两个部分组成:数值(value, val)、梯度值(gradient, grad)。运算中:前向计算(forward)更新val,反向计算(backward)更新grad。

构建神经网络(模型)时,一般会显示定义forward过程,但对于backward计算则要借助训练框架完成。对于上例中如果调用y.backward(),如何触发所有层(layer)的权重梯度更新?

常用方法是计算图的递归遍历:每一层的神经元节点记录好自己的前向节点,然后逐层递归就能依次遍历出所有相关的节点,递归遍历时用拓扑图(topo)存储节点之间边(edges)的信息。

Tensor类的要素:数据包含val、grad、前向节点记录;ops包括forward算式、backward算式;同时具备求解topo图的函数、有链式法则的运算机制。

关键部分如下:

class Tensor:
""" stores a single scalar Tensor and its gradient """
def __init__(self, val, _children=(), _op=''):
self.val = val
self.grad = 0
self._backward = lambda: None  # 反向运算公式
self._prev = set(_children)  # 图关系中的上游节点
self._op = _op # 辅助变量,用于graphviz、debugging、etc
def backward(self):
# topological order all of the children in the graph
topo = []
visited = set()
def build_topo(v):
if v not in visited:
visited.add(v)
for child in v._prev:
build_topo(child)
topo.append(v)
build_topo(self)
# go one variable at a time and apply the chain rule to get its gradient
self.grad = 1
for v in reversed(topo):
v._backward()
#  示例:定义一个加法运算
def __add__(self, other):
other = other if isinstance(other, Tensor) else Tensor(other)
out = Tensor(self.val + other.val, (self, other), '+')
def _backward():
self.grad += out.grad
other.grad += out.grad
out._backward = _backward
return out

在此基础上,再给Tensor增加一些常见的ops(减法、乘法等)操作后,可完成如下运算程序:

x = Tensor(-2.0)
z = 2 * x
y1 = z + 5
y2 = (z * z).relu() + x + 3
loss = y1 - y2 + y2 * x
loss.backward()

打印每个tensor的val和grad:

用PyTorch校验计算是否正确:

import torch
x = torch.tensor([-2], dtype=torch.float32, requires_grad=True)
z = 2 * x
y1 = z + 5
y2 = (z * z).relu() + x + 3
loss = y1 - y2 + y2 * x
loss.backward()

打印对应的数值和梯度:

2 定义网络中的基本元素

在构建模型时,会用到一些基本的元素,神经元(Neuron)、层(Layer)、模块,其中神经元可以是线性的,也可以是非线性(Nonlinear)神经元。

class Module:
def zero_grad(self):
for p in self.parameters():
p.grad = 0
def parameters(self):
return []
class Neuron(Module):
def __init__(self, n_in, nonlinear=True):
self.w = [Tensor(random.uniform(-1,1)) for _ in range(n_in)]
self.b = Tensor(0)
self.nonlinear = nonlinear
def __call__(self, x):
act = sum((wi*xi for wi,xi in zip(self.w, x)), self.b)
return act.relu() if self.nonlinear else act
def parameters(self):
return self.w + [self.b]
def __repr__(self):
return f"{'ReLU' if self.nonlinear else 'Linear'}Neuron({len(self.w)})"
class Layer(Module):
def __init__(self, n_in, nout, **kwargs):
self.neurons = [Neuron(n_in, **kwargs) for _ in range(nout)]
def __call__(self, x):
out = [n(x) for n in self.neurons]
return out[0] if len(out) == 1 else out
def parameters(self):
return [p for n in self.neurons for p in n.parameters()]
def __repr__(self):
return f"Layer of [{', '.join(str(n) for n in self.neurons)}]"

定义MLP(Multi-Layer Perceptron)模块:

class MLP(Module):
def __init__(self, n_in, n_outs):
sz = [n_in] + n_outs
self.layers = [Layer(sz[i], sz[i+1], nonlinear= i!=len(n_outs)-1) for i in range(len(n_outs))]
def __call__(self, x):
for layer in self.layers:
x = layer(x)
return x
def parameters(self):
return [p for layer in self.layers for p in layer.parameters()]
def __repr__(self):
return f"MLP of [{', '.join(str(layer) for layer in self.layers)}]"

3 训练相关的函数定义

SGD优化器:

def SGD(model, learning_rate_decay):
learning_rate = 1.0 - 0.9*learning_rate_decay/100
for p in model.parameters():
p.val -= learning_rate * p.grad

用max-margin计算loss,并添加L2正则项,实现loss和acc的求解函数:

# loss and acc function
def loss_acc_func(parameters, scores, yb, batch_size=None):
# svm "max-margin" loss
losses = [(1 + -yi*scorei).relu() for yi, scorei in zip(yb, scores)]
data_loss = sum(losses) * (1.0 / len(losses))
# L2 regularization
alpha = 1e-4
reg_loss = alpha * sum((p*p for p in parameters))
total_loss = data_loss + reg_loss
# acc:
accuracy = [(yi > 0) == (scorei.val > 0) for yi, scorei in zip(yb, scores)]
return total_loss, sum(accuracy) / len(accuracy)

定义训练函数:

from tqdm import tqdm
def train(X, y, model, step=50, batch_size=None):
"""
训练模型:
:param X: 输入值
:param y: 真值
:param model: 训练模型
:param step: 训练步数
:param batch_size: 分批的尺寸
:return:
"""
bar = tqdm(range(step), colour="red",  desc=f"Training",  ncols=100)
for k in bar:
if batch_size is None:
Xb, yb = X, y
else:
ri = np.random.permutation(X.shape[0])[:batch_size]
Xb, yb = X[ri], y[ri]
inputs = [list(map(Tensor, xrow)) for xrow in Xb]
# forward the model to get scores
scores = list(map(model, inputs))
total_loss, acc = loss_acc_func(model.parameters(), scores, yb)
# backward
model.zero_grad()
total_loss.backward()
# optimizer update
SGD(model, k)
bar.set_postfix(loss=total_loss.val, acc=f"{acc*100}%")

4 训练与验证

用sklearn.datasets的blobs、circles数据训练MLP,观测二分类的训练结果。

4.1

blobs数据的训练

step1:定义两层的MLP模型

# 创建一个两层的网络, 参数361
model = MLP(2, [90, 1])

step2:获取训练数据集

from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=100, n_features=2, centers=2, cluster_std=0.8, )
# 将标签数据y 从0,1 转换为 -1,1:
y = y*2 - 1

显示数据的分布图

step3:调用train函数,训练模型

# 训练6个epoch,每个epoch设置40step:
for i in range(6):
train(X, y, model, step=40)

loss打印输出

随着训练的进行loss在逐步下降,用plt渲染输出结果如下:

4.2

circles数据的训练

step1:定义三层的MLP模型

# 创建一个三层的网络
model = MLP(2, [15, 20, 1])

step2:获取训练数据

from sklearn.datasets import make_circles
X, y = make_circles(n_samples=100, noise=0.06)
# 将标签数据y 从0,1 转换为 -1,1:
y = y*2 - 1

显示数据的分布图

step3: 训练

# 训练并观测结果
for i in range(6):
train(X, y, model, step=30)

这个例子loss收敛得更快,用plt渲染输出结果如下:

5 网络可视化

通过graphviz库将网络显示出来。先将网络图的节点和边都遍历出来:

from graphviz import Digraph
# 将所有节点都遍历出来
def trace(root):
nodes, edges = set(), set()
def build(v):
if v not in nodes:
nodes.add(v)
for child in v._prev:
edges.add((child, v))
build(child)
build(root)
return nodes, edges

然后构造显示图:

def draw_dot(root, format='svg', rankdir='TB'):
"""
format: png | svg | ...
rankdir: TB (top to bottom graph) | LR (left to right) 显示方向
"""
nodes, edges = trace(root)
dot = Digraph(format=format, graph_attr={'rankdir': rankdir})
for n in nodes:
dot.node(name=str(id(n)), label = "{ data %.2f |grad %.2f }" % (n.val, n.grad), shape='record')
if n._op:
dot.node(name=str(id(n)) + n._op, label=n._op)
dot.edge(str(id(n)) + n._op, str(id(n)))
for n1, n2 in edges:
dot.edge(str(id(n1)), str(id(n2)) + n2._op)
return dot

测试:

x = Tensor(-2.0)
z = 2 * x
y = z.relu()
y.backward()
draw_dot(y, rankdir='TB')

总结:本文提供案例中的简易训练框架,从tensor、网络构建、训练函数定义,到支持MLP二分类,基本涵盖了训练关键要素,适合用于理解深度学习框架原理。读者可以切换数据集尝试,只要是一维数据都能训练,观测输出结果是否收敛,若不收敛可以调节MLP的深度或宽度。

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

在这里插入图片描述

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

OpenViking上下文数据库Golang集成实践 技术创新文件系统范式:将AI Agent的上下文管理从扁平向量存储提升为结构化文件系统分层检索策略:L0/L1/L2三层加载机制,减少62.1%的Token消耗记忆自迭代:会话提交触发Agent经验沉淀,实现越用越智能工程实践完整Golang实现:提供生产级可用的OpenViking客户端库企业级集成方案:涵盖文档摄入、检索、会话管理等全流程性能优化成果:检索准确率提升24.1%,响应时间减少53.3%可观测性提升可视化检索轨迹:实现检索过程的白盒化,调试效率提升77.1%全面监控指标。 阅读详情

相关推荐

(深度学习)Pytorch实现MLP并在MNIST数据集上验证

Pytorch实现MLP并在MNIST数据集上验证 1.综述 2.MNIST数据集 3.代码细节说明 4.详细代码 综述 ”PyTorch实现MLP并在MNIST数据集上验证“是我所上的模式识别与深度学习课程的第一个实验,主要是给我们练练手熟悉熟悉Pytorch的——如果你也是刚刚入门Pytorch,这个实验非常适合你来练手! 首先,介绍一下Pytorch: Pytorch是torch的pyt...

junbaba_的博客 8869

基于RAG的企业智能客服项目,已拿70万offer!

基于 RAG 构建一套企业智能客服系统📖。

m0_59164520的博客 1445

Pytorch 学习(五):Pytorch 实现多层感知机(MLP)

Pytorch 实现多层感知机(MLP) 本方法总结自《动手学深度学习》(Pytorch版)github项目 部分内容延续Pytorch 学习(四):Pytorch 实现 Softmax 回归实现方法 实现多层感知器(Multlayer Perceptron)同样遵循以下步骤: 数据集读取 模型搭建和参数初始化 损失函数和下降器构建 模型训练 方法一:从零开始实现 import torch import torch.nn as nn import numpy as np import..

qq_40491305的博客 1万+

从Vibe Coding到可控生产力:Harness Engineering的实践启示

摘要:OpenAI提出的Harness Engineering(工程化治理)理念为AI Agent时代的软件工程提供了关键方法论,旨在解决代码高产出下的质量闭环、上下文管理等核心矛盾。其三大目标包括重构工程师角色、将AI纳入可控体系、实现低成本纠错,通过六大举措(如角色重构、机械化约束、反熵机制等)重构工程流程。该理念与vibe coding高度互补,既保留灵感驱动的敏捷性,又通过工程化体系保障稳定性,最终推动工程师从"代码生产者"升级为"工程体系设计者"。

小程故事多的博客 4400

基于Pytorch的MLP实现

基于Pytorch的MLP实现 目标 使用pytorch构建MLP网络 训练集使用MNIST数据集 使用GPU加速运算 要求准确率能达到92%以上 保存模型 实现 数据集:MNIST数据集的载入 MNIST数据集是一种常用的数据集,为28*28的手写数字训练集,label使用独热码,在pytorch中,可以使用torchvision.datasets....

月见樽 5721

pytorch学习笔记——5.2Pytorch中MLP分类模型

在MLP分类器的分析过程中,可以分为数据预处理和网络训练以及可视化部分,其中数据预处理部分会针对数据是否进行标准化处理进行单独分类,主要是用于分析数据标准化对于MLP网络训练的重要性。

weixin_52067875的博客 4216

【深度学习入门系列】 pytorch实现多层感知机(MLP)(内含分类、回归任务实例)

先明确了BP、BP神经网络、MLP的概念,讨论了三者的区别和联系。 之后用pytorch搭建多层感知机神经网络,这部分主要针对新手小白,以实战为主。内含2023年美赛春季赛Y题改变回归实例和一个反骗保欺诈分类实例。

如果没有躺赢的命,那就站起来奔跑,你的努力一定会对得起这一路的颠沛流离。 1万+

用AI学习graphify

Graphify是一个AI驱动的知识图谱构建工具,能够将代码、文档、论文、图像和视频等多模态数据转换为结构化知识图谱。其核心技术特点包括: 多模态处理能力: 支持25+编程语言的AST解析 处理PDF、Markdown等文档 集成Whisper进行音视频转录 高效知识提取: 采用确定性AST解析与LLM语义提取结合 相比直接读取源文件,查询token消耗最多减少71.5倍 增量更新机制仅处理变更文件 智能分析功能: 自动识别高中心性的"上帝节点" 发现跨领域的"意外连接&quo

我的专栏 750

使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证

这是深度学习课程的第一个实验,主要目的就是熟悉 Pytorch 框架。MLP 是多层感知器,我这次实现的是四层感知器,代码和思路参考了网上的很多文章。个人认为,感知器的代码大同小异,尤其是用 Pytorch 实现,除了层数和参数外,代码都很相似。 Pytorch 写神经网络的主要步骤主要有以下几步: 1. 构建网络结构 2. 加载数据集 3. 训练神经网络(包括优化器的选择和 Loss 的计算) 4. 测试神经网络

落队的飞行兵 1万+

到底什么是Harness工程?一篇文章从入门到企业落地全解析

随着OpenClaw爆火,Harness Engineering(驾驭工程)成为AI编程时代的热门概念,很多小白对其感到陌生。本文用通俗类比和真实案例,避开复杂术语,从基础定义入手,讲清Harness Engineering的核心逻辑——人类工程师设计“约束系统”(马具),让AI模型(烈马)安全高效地完成代码工作,同时拆解其核心组件、企业落地场景和实战成果,帮小白快速入门,读懂这项能解放人力、提升效率的新技术,轻松掌握它的核心价值和落地思路。

program哲学 3270

Pytorch实现MLP(基于PyTorch实现)

本专栏整理了《图神经网络代码实战》,内包含了不同图神经网络的相关代码实现(PyG以及自实现),理论与实践相结合,如GCN、GAT、GraphSAGE等经典图网络,每一个代码实例都附带有完整的代码。

优快云 精品推荐 1万+

PyTorch 训练循环全攻略:从零到精通的深度学习秘籍

想象一下,您正站在深度学习的起跑线上,手里握着 PyTorch 这个“魔法工具”。它简单到让新手也能快速上手,却强大到能驱动最前沿的 AI 研究。从自动驾驶到智能聊天机器人,PyTorch 的身影无处不在,尤其是它的训练循环(Training Loop),简直是模型从“零”到“英雄”的秘密武器。不管您是想在面试中惊艳考官,还是希望在项目中跑出一个靠谱的模型,这篇文章都将是您的最佳起点。我们将用最接地气的语言,带您从 PyTorch 的基础走进训练循环的核心,配上实打实的代码和实战经验。

吴师兄大模型的博客 2422

Pytorch+PyG实现MLP

本专栏整理了《图神经网络代码实战》,内包含了不同图神经网络的相关代码实现(PyG以及自实现),理论与实践相结合,如GCN、GAT、GraphSAGE等经典图网络,每一个代码实例都附带有完整的代码。

优快云 精品推荐 1万+

学习大模型的详细计划,收藏这一篇就够了!

在开始学习大语言模型之前,建议确保你掌握了线性代数、概率论和微积分等数学基础。此外,需要对自然语言处理(NLP)和机器学习的基本概念有所了解。了解自然语言处理的历史、发展以及常用的技术和方法,如词向量表示、文本分类、语言生成等。掌握Python编程语言是学习大语言模型的必备技能。Python在NLP领域拥有广泛的支持和丰富的库,例如NLTK、spaCy和Transformers等,这些库可以帮助学习者更轻松地开展自然语言处理项目。:掌握深度学习的基本概念、常见神经网络结构和训练方法是理解大语言模型的关键。

z551646的博客 2165

PyTorch实现MLP-Mixer:深入理解深度学习模型

多层感知机(MLP)是一种基础的前馈人工神经网络,它包含至少三层节点:输入层、隐藏层和输出层。每层由多个神经元组成,神经元之间的连接具有权重,而隐藏层和输出层中的神经元通常会应用一个激活函数。MLP能够学习到输入和输出之间的非线性关系,这使得它在解决分类和回归问题方面表现出色。PyTorch的核心模块包括torchtorch.nn等,它们涵盖了构建神经网络所需的基本构件。下面简单介绍这些模块的作用:torch:提供多维数组的操作、数学运算、自动求导等基础功能。torch.nn。

weixin_29607511的博客 1280

Frida精准定位Shopee x-sap-ri动态签名生成函数

x-sap-ri是Shopee客户端生成的上下文感知型动态令牌,本质为基于设备标识、请求路径与毫秒级时间戳三元组的SHA256哈希值,经Base64编码后作为防重放与防批量伪造的核心校验字段。其生成逻辑深度混淆且跨Java/Native层,静态分析失效,而Frida凭借内存级函数调用拦截与JNI层穿透能力,成为唯一可行的技术路径。本文聚焦Frida在加固App中的实战适配——通过libcrypto.so API特征扫描反向定位被抹名的生成函数,实现对x-sap-ri输入参数(如16字节device_id加密

weixin_33978578的博客 610

【学习笔记】深度学习实战 | PyTorch 入门(MLP为例)

【学习笔记】深度学习实战 | PyTorch 入门(MLP为例)

BenjaminChen的博客 8425

RPMsg:协议简介

两台计算机可以通过TCP/IP进行通信,那么同一颗芯片上的两个核心怎么通信呢?

SunnyZhou-1024的博客 1万+

Pytorch实战入门(一):MLP

前言 环境:   Python 3.7.4   Pytorch 1.3.1 任务:   构建一个多层感知机(Multi-Layer Perceptron,MLP)学习随机生成的输入和输出数据。 ps:MLP好像别名挺多的其实就是全连接网络,有的也叫人工神经网络(Artificial Neural Network,ANN);其中的全连接层(Fully Connected Layers)一般搭网络时取层名为 FC;而 FCN 一般是全卷积网络(Fully Convolutional Networks) 流程:

秋山丶雪绪的博客 3428

Windows系统离线搭建PyTorch深度学习环境全攻略(CUDA+cudnn实战)

本文提供了一份在Windows系统下离线搭建PyTorch深度学习环境的完整实战指南。文章详细讲解了如何在没有网络连接的情况下,正确安装和配置CUDA、cudnn以及PyTorch,并构建独立的Python虚拟环境。重点强调了版本依赖关系的重要性,并提供了从驱动准备到环境验证的每一步操作,旨在帮助用户高效、稳定地部署可复用的GPU深度学习开发环境。

table的专栏 579

YOLOv12涨点改进 | Neck特征融合改进篇 | YOLOv12引 入 BiFPN双向特征金字塔网络,显著提升了多尺度特征融合效率,目标检测、图像分割、图像分类,助力高效涨点

本文提出了一种基于BiFPN特征融合模块优化的YOLOv12目标检测方法。BiFPN通过引入可学习的权重实现高效的多尺度特征融合,结合双向连接机制提升特征提取能力。实验表明,该方法在COCO数据集上实现了优异的检测性能。文章详细介绍了BiFPN模块的原理、核心代码实现,以及如何将其集成到YOLOv12框架中,包括模块添加、配置文件修改等具体步骤。这种改进方案具有参数少、计算量小等优势,为高效目标检测提供了一种新的技术路径。

Ai缝合怪、助力小伙伴高效发论文 391

多层感知机(MLP)实战教程:使用PyTorch实现

在本次实战案例中,我们可以看到,即使是一个相对简单的模型,也能够成功完成原本需要人类智慧才能实现的任务。那么如果我们可以设计出更复杂的模型,投喂更广泛的数据是不是模型的能力会超过人类呢。

qq_28413709的博客 5180

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 温度传感器DS18B20

2.1 理论分析 2.1.1概述 DS18B20 是 DALLAS 最新单线数字温度传感器,新的"一线器件"体积更小、适用电压更宽、更经济。Dallas 半导体公司的数字化温度传感器 DS1820 是世界上第一片支持 "一线总线"接口的温度传感器。 DS18B20采用的单总线协议,也就是只需占用主机一个I/O口,无需其他外围电路,直接将环境温度转换为数字信号,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。另外,以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量

不问归期的博客 8305
上一篇: 大模型应用开发实战教程(非常详细),新时代核心竞争力从入门到精通,收藏这一篇就够了!
下一篇: 自主智能体记忆架构实战教程(非常详细),从OpenClaw到企业级落地,收藏这一篇就够了!
Python_金钱豹
博客等级 码龄5年 1万+粉丝 2835原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值