教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本指南以 AI-For-Beginners 课程第 3 单元第 5 课神经网络框架为核心系统讲解深度学习框架的底层原理张量运算、自动求导、计算图与 GPU 并行与高层用法Keras 与 PyTorch 的层堆叠、训练循环并完整覆盖本课另一重要主题——过拟合的成因、检测与预防。学完本指南你将能独立运行仓库中的 IntroKerasTF.ipynb、IntroPyTorch.ipynb 与 IntroKeras.ipynb并完成 实验任务。为什么需要神经网络框架两大核心能力要高效地训练神经网络任何框架都必须解决两个问题在张量tensor上执行运算例如矩阵乘法、加法以及 sigmoid、softmax 等函数计算。张量本质上是多维数组非常适合表示各类数据——400×400 的黑白图片、400×400×3 的彩色图片、16×400×400×3 的 16 张彩色图片小批量minibatch乃至 8×25×400×400×3 的 8 段 1 秒视频批量。计算所有表达式的梯度这是执行梯度下降优化gradient descent optimization的前提。numpy可以完成第一部分张量运算但梯度计算需要专门机制。在上一节课程中我们自己实现的 OwnFramework.ipynb 必须在backward方法中手动编写每一个导数函数来完成反向传播backpropagation。理想情况下框架应当能够自动计算我们定义的任意表达式的梯度这正是主流深度学习框架的核心价值。此外框架还必须支持在GPU或其他专用计算单元如 TPU上执行计算。深度神经网络训练需要海量计算而将这些计算并行化parallelize即把计算分布到多个设备上到 GPU 上是至关重要的。从仓库的笔记本可以看出PyTorch 通过在代码开头定义device cuda if torch.cuda.is_available() else cpu再通过.to(device)将张量与数据搬到对应设备即可实现同一套代码在 CPU/GPU 上无缝切换参见 IntroPyTorch.ipynb 的 Computations on GPU 小节TensorFlow 则通过tf.function装饰器将自定义 Python 函数纳入计算图从而避免 CPU/GPU 之间来回搬运数据。两大主流框架与双层 API 结构当前最流行的两个神经网络框架是TensorFlow和PyTorch二者都在 CPU 与 GPU 之上提供操作张量的低层 API在低层 API 之上各自还有一个高层 API即Keras对应 TensorFlow与PyTorch Lightning对应 PyTorch。层级TensorFlow 系PyTorch 系低层 APITensorFlowPyTorch高层 APIKerasPyTorch Lightning低层 API计算图与自动微分两个框架的低层 API 都允许构建所谓的计算图computational graph。这张图定义了给定输入参数后如何计算输出通常是损失函数并且可以被推送到 GPU 上执行如果可用。计算图还带有求导函数能够计算梯度进而用于优化模型参数。以 TensorFlow 为例IntroKerasTF.ipynb用tf.constant、tf.random.normal创建张量支持与 numpy 类似的逐元素算术运算用.numpy()提取 numpy 数组用tf.Variable表示可修改的权重支持assign、assign_add梯度计算采用tf.GradientTape()惯用法把计算包在with tf.GradientTape()块内用tape.watch标记需要求梯度的张量所有Variable会被自动追踪最后用tape.gradient(loss, [w, b])一次性取回多个参数的梯度。以 PyTorch 为例IntroPyTorch.ipynb把任意张量的requires_grad属性设为True此后所有涉及该张量的运算都会被自动追踪以用于梯度计算调用backward()后梯度通过grad属性获得每个带requires_gradTrue的张量会维护一个grad_fn它按链式求导法则计算表达式的导数——例如c torch.mean(...)的grad_fn是指向MeanBackward的函数PyTorch 会自动累积梯度连续调用backward(retain_graphTrue)时新梯度会累加到grad字段上需要手动调用grad.zero_()清零后才能从头计算对于向量函数 yf(x)PyTorch 不直接返回完整雅可比矩阵Jacobian而是计算雅可比与某个向量 v 的乘积 v^T·J调用时把 v 作为backward的参数传入。值得一提的是上一课的 OwnFramework.ipynb 中所有导数都是手写进backward的而在真实框架中内置张量函数的导数都已显式实现因此可以自动微分任何可定义表达式这正是框架带来的根本性解放。高层 API把网络看作层的序列高层 API基本把神经网络视为层的序列a sequence of layers使大多数网络的构建变得非常简单。训练模型通常只需准备好数据然后调用一次fit函数即可完成。高层 API 的优势在于让你无需操心大量细节就能非常快速地构造典型神经网络。与此同时低层 API 对训练过程提供更多控制因此在研究工作中当你处理全新的网络架构时被广泛使用。两种 API 完全可以混用你可以用低层 API 开发自己的网络层架构再把它嵌入到由高层 API 构造并训练的大网络中也可以先用高层 API 把网络定义为层的序列再用自写的低层训练循环进行优化。两个 API 基于相同的基本概念设计上就是为协同工作而生的。课程学习路线从低层到高层本课程同时为 PyTorch 与 TensorFlow 提供大部分内容你可以选择偏好的框架只看对应的笔记本。不确定选哪个时可以阅读互联网上关于 PyTorch vs TensorFlow 的讨论也可以两个都看一看。在可能的情况下课程为简洁性倾向使用高层 API但课程同样强调从底层理解神经网络的工作原理因此建议先从低层 API 与张量入手。想快速上手的话也可以跳过这些细节直接进入高层 API 笔记本。本课的配套练习笔记本如下层级TensorFlow 系PyTorch 系低层 APITensorFlowKeras 笔记本PyTorch高层 APIKerasPyTorch Lightning本课程暂未提供对应笔记本环境准备TensorFlow 2.x KerasKeras 已集成在 TensorFlow 2.x 中确认安装 2.x 版本即可。安装方式pip install tensorflow或conda install tensorflow仓库笔记本实测版本为 TensorFlow/Keras 2.7.0。PyTorch确保安装较新版本。按官方本地安装指引进行通常即pip install torch torchvision或conda install pytorch -c pytorch仓库笔记本实测版本为 PyTorch 1.11.0cu113。TensorFlow/Keras 实战要点用低层 API 完成线性回归在 IntroKerasTF.ipynb 中线性回归被定义为直线 f_W,b(x)Wxb均方误差MSE作为损失函数L(W,b) (1/N)·Σ(f_W,b(x_i) − y_i)²权重w与偏置b用tf.Variable定义初始权重设为 100.0 以观察收敛过程训练在tf.GradientTape()内完成一次前向计算与损失求值随后用tape.gradient(loss, [w, b])取梯度再通过w.assign_sub(learning_rate * dloss_dw)与b.assign_sub(learning_rate * dloss_db)更新参数公式为W^(n1)W^(n)−η·∂L/∂Wb^(n1)b^(n)−η·∂L/∂b整个训练按 minibatch示例中 batch_size4划分数据集多次遍历epoch。仓库中的运行结果展示了损失从约 94.5 快速下降到约 0.34 的过程最终学到的 W≈1.86、b≈1.07与生成数据时的真实参数W2、b≈1非常接近。数据还用np.random.seed(13)固定了随机种子以保证可复现。此外还可以用tf.data.Dataset管理数据tf.data.Dataset.from_tensor_slices((x, y))从张量切片构造数据集配合.shuffle(buffer_size).batch(batch_size)实现打乱与分批迭代。用tf.function装饰train_on_batch后整个函数会被编译进同一张计算图在大数据集与 GPU 场景下能明显提速。用高层 APIKeras快速构建分类器在 IntroKeras.ipynb 中Keras 用Sequential模型把网络定义为层序列例如model keras.models.Sequential() model.add(keras.Input(shape(2,))) model.add(keras.layers.Dense(1)) model.add(keras.layers.Activation(keras.activations.sigmoid))其中Input层指定网络输入尺寸Dense层是包含可训练权重的感知机sigmoidActivation层把输出压缩到 0-1 区间使其成为概率。更简洁的写法是把输入尺寸与激活函数直接放进Densekeras.layers.Dense(1, input_shape(2,), activationsigmoid)。训练前需要compile模型本质是指定三件事损失函数loss二分类任务用二元交叉熵binary_crossentropy优化器optimizer最简可用sgd随机梯度下降也可用更复杂的adam需要指定学习率时提供完整对象如keras.optimizers.SGD(learning_rate0.2)评估指标metrics分类任务常用acc准确率。随后调用fit即可训练关键参数包括x/y指定特征与标签validation_data(val_x, val_y)每轮评估验证集epochs指定轮数batch_size指定小批量大小。fit返回history对象内含每轮的 loss 与指标可直接绘制训练/验证曲线。仓库示例还提示batch_size过大会使低维小数据的训练不稳定小批量给出更精确的梯度方向学习率过高可能导致过拟合或不稳定过低则收敛更慢。fit可多次连续调用以继续训练想从头开始则需重新运行模型定义单元。Keras 笔记本还演示了多分类的完整套路见后文分类速查表末层神经元数等于类别数 C、末层用softmax激活、标签转 one-hot 编码keras.utils.to_categorical或np.eye、损失用categorical_crossentropy若标签直接用类别序号则可改用sparse_categorical_crossentropy简化代码。多标签分类场景下样本可同时属于多个类别标签用 one-hot 编码、末层用sigmoid每个类别概率独立落在 0-1损失仍可用交叉熵。PyTorch 实战要点自动微分驱动的最小化示例IntroPyTorch.ipynb 先用自动微分求二元函数 f(x1,x2)(x1−3)²(x22)² 的最小值张量x torch.zeros(2, requires_gradTrue)保存当前坐标每步y f(x); y.backward(); gr x.grad; x.data.add_(-lr * gr); x.grad.zero_()按梯度下降公式 x^(n1)x^(n)−η∇f 迭代。仓库运行结果展示 15 步内坐标从 (0,0) 逐步逼近最小值点 (3,−2)清晰演示了 requires_grad → backward → grad → 参数更新 → 梯度清零的标准流程。PyTorch 中大量运算有原地版本以_结尾如add_而更新被 Autograd 追踪的张量时须用.data间接修改如W.data.sub_(lr * W.grad)、W.data.zero_()否则无法直接修改被追踪的张量。低层训练循环与数据加载PyTorch 版线性回归与 TensorFlow 版结构对称权重与偏置以requires_gradTrue张量定义train_on_batch中前向计算、loss.backward()、w.data.sub_(learning_rate * w.grad)、w.grad.zero_()与b.grad.zero_()。同样按 minibatch 遍历多轮收敛损失曲线与 TensorFlow 版完全一致94.52 → 0.34最终参数也高度吻合说明两个框架在相同任务上给出等价结果。PyTorch 的数据加载机制基于两个概念Dataset数据来源可为 Iterable 或 Map-style与Dataloader负责从数据集加载数据并切分为 minibatch。示例中用torch.utils.data.TensorDataset(tensor_x, tensor_y)构造数据集再用torch.utils.data.DataLoader(dataset, batch_size16)迭代出张量对。nn.Module、Sequential 与优化器在 PyTorch 中torch.nn.Module专门用于表示神经网络定义网络有两种方式Sequential直接列出构成网络的层序列适合标准的前馈网络类方式继承torch.nn.Module更灵活可表达任意复杂架构。模块内部可使用标准层Linear稠密线性层等价于单层感知机、Softmax/Sigmoid/ReLU对应激活函数的层还有卷积、循环等特殊网络类型的层课程后续会涉及。注意多数激活函数与损失函数在 PyTorch 中同时以函数torch.nn.functional命名空间与层torch.nn命名空间两种形式存在激活函数通常直接使用函数形式更省事。parameters()方法返回训练中需要调整的所有参数对应 W 与 b且requires_gradTrue。内置优化器实现了包括梯度下降在内的多种优化方法随机梯度下降可定义为optim torch.optim.SGD(net.parameters(), lr0.05)结合优化器的标准训练循环为optim.zero_grad()→loss.backward()→optim.step()。nn.Module实现了 Python 的__call__()因此可直接用net(x)而非net.forward(x)。仓库还封装了通用train函数内部改用torch.optim.Adam并在每轮打印 loss 与验证集准确率。单层感知机可直接用内置torch.nn.Linear(2, 1)2 输入 1 输出多层感知机可用torch.nn.Sequential(torch.nn.Linear(2,5), torch.nn.Sigmoid(), torch.nn.Linear(5,1))一行定义更灵活的类方式则在__init__中把各层如fc1、func、fc2声明为成员Module会自动收集这些内部层的参数供优化器使用。分类任务的损失可用torch.nn.functional.binary_cross_entropy_with_logits等价于先sigmoid再binary_crossentropy且自动对 minibatch 求平均数据归一化时应只从训练集计算 min/max 与取值范围再以同一组 min/max 归一化验证集与测试集——因为真实场景中我们只知道训练集。验证准确率的计算方式为((torch.sigmoid(net(val_x).flatten()) 0.5).float() val_lab).float().mean()。本课实验的 LabFrameworks.ipynb 要求用 PyTorch 或 TensorFlow、以单层与多层全连接网络解决两个分类问题Iris 鸢尾花分类表格输入、4 个数值特征分 3 类经典机器学习可处理与 MNIST 手写数字分类并尝试不同网络架构争取最佳准确率。分类配置速查表Keras 笔记总结不同分类任务对应不同的标签格式、末层激活函数与损失函数选择规则如下分类类型标签格式激活函数损失函数二分类第 1 类概率单输出sigmoidbinary crossentropy二分类One-hot 编码2 输出softmaxcategorical crossentropy多分类One-hot 编码softmaxcategorical crossentropy多分类类别序号softmaxsparse categorical crossentropy多标签One-hot 编码sigmoidcategorical crossentropy过拟合概念、成因、检测与预防掌握了框架之后本课转入机器学习中一个极其重要的概念——过拟合overfitting。考虑用模型去逼近图中 5 个点图上以 x 标记的问题线性模型2 个参数非线性模型7 个参数训练误差 5.3训练误差 0验证误差 5.1验证误差 20左边是良好的直线逼近。由于参数数量恰当模型正确抓住了点的分布模式。右边模型过于强大。由于只有 5 个点而模型有 7 个参数它可以调整到穿过所有点使训练误差为 0但这阻止了模型理解数据背后的正确模式导致验证误差非常高。因此在模型的丰富度参数数量与训练样本数量之间保持正确平衡至关重要。为什么过拟合会发生训练数据不足模型过于强大参数过多输入数据中噪声noise过多。如何检测过拟合从上图可以看出过拟合可以通过极低的训练误差 较高的验证误差来识别。通常训练过程中训练误差与验证误差一开始都会下降然后到某个时刻验证误差可能停止下降并开始上升。这就是过拟合的信号意味着我们此时应停止训练或至少保存一份模型快照如何预防过拟合如果发现过拟合正在发生可以采取以下措施之一增加训练数据量降低模型复杂度使用一些正则化regularization技巧例如 Dropout课程后续会展开介绍。过拟合与偏差-方差权衡Bias-Variance Tradeoff过拟合实际上是统计学中一个更一般性问题的特例称为偏差-方差权衡bias-variance tradeoff。如果考察模型误差的可能来源可以看到两类误差偏差误差bias errors由算法无法正确捕捉训练数据之间的关系引起。可能源于模型不够强大欠拟合underfitting。方差误差variance errors由模型去逼近输入数据中的噪声而非有意义的关系引起过拟合。训练过程中偏差误差会下降因为模型学会逼近数据而方差误差会上升。因此及时停止训练——无论是手动检测到过拟合时还是自动通过引入正则化——对于防止过拟合至关重要。课后挑战与复习在配套笔记本底部可以找到Task请逐一完成例如绘制训练过程中训练/验证损失与准确率的曲线PyTorch 笔记本 Task 1用该代码尝试解决 MNIST 分类问题注意用cross_entropy_with_logits作为损失函数PyTorch 笔记本 Task 2用 Keras 训练 MNIST 手写数字分类器尝试不同层数/神经元数与激活函数比较能获得的最佳准确率Keras 笔记本 Task。自我检验问题时可以思考TensorFlow 与 PyTorch 之间的差异是什么过拟合与欠拟合之间的差异是什么小结本课围绕两大最流行 AI 框架 TensorFlow 与 PyTorch 展开二者低层 API 都以张量为基本运算单元并内置自动微分与 GPU 并行能力高层 APIKeras、PyTorch Lightning则把网络当作层的序列、用一行fit完成训练且低层与高层 API 可以自由混用配套三个笔记本分别演示了低层求导、训练循环与高层建模的完整流程。同时本课深入讲解了过拟合的成因数据不足、模型过强、噪声过多、检测方法训练误差低而验证误差升高与预防手段增加数据、降低复杂度、正则化并把它置于偏差-方差权衡这一统计学框架下理解。这两部分内容将直接服务于后续课程中更复杂的网络架构设计与训练调优实践。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI-For-Beginners 神经网络框架实战TensorFlow/Keras 与 PyTorch 双栈入门及过拟合防治AI For Beginners 神经网络框架实战TensorFlow/Keras 与 PyTorch 双栈入门及过拟合防治 本指南基于 AI For Beg教程人工智能机器学习深度学习AI-For-Beginners 神经网络框架指南TensorFlow 与 PyTorch 双栈实战与过拟合原理AI For Beginners 神经网络框架指南TensorFlow 与 PyTorch 双栈实战与过拟合原理 本篇技术指南基于开源课程 AI For Be教程人工智能机器学习深度学习generative-ai-for-beginners 学习路线TensorFlow 与 PyTorch 的神经网络框架选型及过拟合防治generative ai for beginners 学习路线TensorFlow 与 PyTorch 的神经网络框架选型及过拟合防治 本篇技术指南聚焦于教程人工智能大模型上一篇Friend 桌面端 Shell 功能对等不变量INV-NAV-1跨 Shell 导航去重、可达性与顶层导航栏设计指南下一篇Home Assistant 使用 lametric.chart 在 LaMetric 设备上绘制数据图表趋势可视化实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考