《PyTorch:从基础概念到实战应用》
《PyTorch:从基础概念到实战应用》
- 一、PyTorch 初印象
- 二、PyTorch 之历史溯源
- 三、PyTorch 核心优势尽显
- (一)简洁高效,契合思维
- (二)易于上手,调试便捷
- (三)社区繁荣,资源丰富
- (四)预训练模型,赋能应用
- 四、PyTorch 环境搭建指南
- 五、张量与自动求导:PyTorch 的基石
- 六、神经网络构建实战
- (一)构建模块剖析
- (二)模型定义之道
- (三)层与模块的灵活运用
- (四)参数初始化技巧
- (五)模型训练与优化实战
- 七、PyTorch 多领域应用实例剖析
- 八、学习 PyTorch 的进阶之路
- 九、PyTorch 未来展望
一、PyTorch 初印象
在当今的人工智能领域,深度学习已然成为炙手可热的核心技术,驱动着众多领域的变革与发展。而 PyTorch 作为深度学习框架中的佼佼者,正以其独特的魅力与强大的功能,吸引着全球无数开发者与研究者的目光,为智能时代的前行注入源源不断的动力。
PyTorch 是一个基于 Torch 库的开源 Python 机器学习库,由 Meta Platforms(原 Facebook)的人工智能研究团队倾心打造,现隶属于 Linux 基金会项目。自 2017 年正式发布以来,PyTorch 凭借其简洁易用、灵活高效的特性,迅速在科研与工业界崭露头角,成为深度学习领域的明星框架。它就像是一位全能的助手,既能助力研究者轻松探索前沿的深度学习算法,快速搭建和试验各种创新模型;又能为开发者提供强大的工具,将深度学习模型顺利应用于实际产品之中,解决诸多复杂的现实问题。
二、PyTorch 之历史溯源
PyTorch 的诞生绝非偶然,它承载着 Facebook 人工智能研究团队的智慧与心血,有着深厚的技术底蕴。其前身是 Torch,一个基于 Lua 语言的机器学习库。在当时,Torch 以其灵活性和强大的张量计算能力,在科研领域小有名气,为众多研究者提供了探索机器学习前沿的工具。然而,Lua 语言的小众性限制了 Torch 的进一步普及与应用,难以满足更广泛开发者群体的需求。
于是,Facebook 团队决心基于 Torch 进行革新,采用 Python 语言对其核心功能进行重新设计与开发,让这个强大的工具能够拥抱更广阔的天地。2016 年,PyTorch 项目悄然启动,犹如一颗在深度学习土壤中埋下的种子,开始积蓄成长的力量。经过一段时间的精心雕琢与打磨,2017 年 1 月,PyTorch 正式亮相,一经推出便在人工智能社区引发了强烈的关注与热议。
在随后的发展历程中,PyTorch 一路高歌猛进,持续推出一系列重要版本更新,不断丰富自身功能、提升性能。2017 年 8 月,PyTorch V 0.2.0 发布,引入广播、高级索引、高阶梯度、新图层以及分布式训练等特性,前两者进一步方便了 Tensor 与 Numpy 互转,让数据处理更加便捷高效;2018 年 4 月,Caffe2 代码合并到 PyTorch,Facebook 旨在将 PyTorch 的研究特性与 Caffe2 的生产特性完美融合,为从研究到生产的全流程赋能;同年 10 月,PyTorch V 1.0.0 重磅发布,标志着 PyTorch 走向成熟,它融合了自身灵活性、研究优势与 Caffe2 的后端与应用能力、ONNX 的框架转换能力于一体,成为了一个兼具科研探索与工业落地实力的深度学习平台。
此后,PyTorch 依旧保持着旺盛的创新活力,如 2019 年 5 月的 V 1.1 版本提供新 API、原生支持 TensorBoard 和自定义循环神经网络,2023 年 3 月的 V 2.0 版本引入 TorchDynamo 和 TorchInductor 提升推理速度等。每一次版本迭代,都是对前沿技术趋势的精准把握,对用户需求的深度回应,推动着 PyTorch 在深度学习的浪潮中稳步前行,不断拓展着深度学习的边界,让更多创新构想得以落地生根、开花结果。
三、PyTorch 核心优势尽显
(一)简洁高效,契合思维
PyTorch 的设计理念独具匠心,追求极致的简洁性,极力避免不必要的封装,力求让开发者以最直接、高效的方式实现想法。它遵循 tensor、autograd、nn.Module 三个由低到高的抽象层次,分别对应高维数组(张量)、自动求导(变量)和神经网络(层 / 模块)。这三者紧密相连,开发者能够轻松地同步修改与操作,使得代码如行云流水般清晰易懂。当构建一个简单的神经网络时,使用 PyTorch 只需寥寥数行代码,就能精准地定义出模型的结构、参数以及前向传播的逻辑,这种简洁的代码风格不仅易于编写,更便于后续的维护与优化。
与一些传统框架相比,PyTorch 更加贴近人类的思维方式,堪称 “所思即所得” 的典范。在模型构建过程中,开发者可以依据实际需求,随心所欲地调整网络结构,即时添加、删除或修改层,就如同搭建积木一般灵活自如。比如在探索新的深度学习算法时,研究人员能够快速地将脑海中的构想通过 PyTorch 转化为实际代码,迅速进行试验与验证,极大地提升了创新的效率。
(二)易于上手,调试便捷
对于广大熟悉 Python 的开发者而言,PyTorch 就像是一位久别重逢的老友,几乎没有学习成本。其 API 设计与 Python 语法高度契合,并且提供了丰富且详细的文档、循序渐进的指南以及活跃的社区论坛,无论是初学者还是经验丰富的开发者,都能在这个友好的环境中迅速找到所需的帮助,快速掌握其核心用法。
在调试方面,PyTorch 更是展现出了无与伦比的优势。由于采用动态计算图,开发者可以在运行时实时查看、修改中间变量的值,轻松地设置断点,逐行调试代码,精准定位问题所在。这就好比在黑暗中行走时,手中拥有了一盏明灯,能够照亮每一个角落,让调试过程变得高效而愉悦。相比之下,静态图框架在调试时往往需要额外的工具和复杂的操作,而 PyTorch 让调试回归本质,简单直接。
(三)社区繁荣,资源丰富
PyTorch 拥有一个充满活力、热情洋溢的开源社区,汇聚了来自全球各地的开发者、研究者以及爱好者。这个社区就像是一座巨大的宝库,为用户提供了海量的教程、工具、插件以及预训练模型,无论遇到何种问题,都能在社区中找到答案或灵感。从基础的入门教程到前沿的学术研究分享,从实用的代码示例到高效的工具插件,应有尽有,满足不同层次、不同领域用户的需求。
与此同时,随着 PyTorch 的日益普及,越来越多的学术论文和开源项目选择以 PyTorch 作为实现工具。这意味着用户不仅能够紧跟学术前沿,复现最新的研究成果,还能借鉴丰富的开源项目经验,站在巨人的肩膀上快速前行,避免重复造轮子,将更多的精力投入到创新性的工作中。
(四)预训练模型,赋能应用
在当今快节奏的开发环境中,时间就是金钱,效率就是生命。PyTorch 深知这一点,提供了大量经过精心训练、涵盖多个领域的预训练模型,如在计算机视觉领域声名远扬的 ResNet、VGG 等,以及在自然语言处理领域表现卓越的 BERT、GPT 等。这些预训练模型就像是一个个强大的知识引擎,蕴含着海量的信息和智慧,开发者只需根据具体任务进行微调,就能快速构建出高性能的应用。
例如,在开发一个图像分类应用时,开发者无需从头开始训练模型,耗费大量的时间和计算资源,只需加载预训练的 ResNet 模型,利用少量的目标数据集进行微调,就能在短时间内达到令人满意的准确率,大大缩短了开发周期,让产品能够更快地推向市场,抢占先机。
四、PyTorch 环境搭建指南
正所谓 “工欲善其事,必先利其器”,在开启 PyTorch 的精彩之旅前,搭建一个稳定、适配的开发环境至关重要。接下来,我们将以 Windows 和 Linux 系统为例,为大家详细介绍 PyTorch 环境的搭建步骤。
在 Windows 系统下,首先要安装 Anaconda。Anaconda 是一个强大的开源 Python 和 R 语言的分布式版本控制系统,它集成了 conda、Python 以及众多科学计算所需的包及其依赖项,为科学计算与机器学习提供了极大的便利。前往 Anaconda 官网下载适合 Windows 系统的 Anaconda 个人版安装包,下载完成后,双击安装程序,按照安装向导的指引逐步操作。在安装过程中,建议勾选 “将 Anaconda 添加到系统 PATH” 选项,这样就能在命令行中直接调用 conda 命令,后续操作更加便捷。安装完毕后,打开命令行窗口(或 Anaconda Prompt),输入 “conda --version”,若能正确显示 Anaconda 的版本信息,说明安装成功。
由于 PyTorch 的官方服务器位于国外,直接下载安装包可能速度较慢,所以我们推荐配置清华镜像源来加速下载过程。在 Anaconda Prompt 中依次输入以下命令:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
这几条命令能够将清华镜像源添加到 conda 的配置中,让后续的库安装如虎添翼。
接下来,使用 conda 创建一个专门用于 PyTorch 开发的虚拟环境,例如创建一个名为 “pytorch_env”、指定 Python 版本为 3.8 的虚拟环境,在 Anaconda Prompt 中执行:“conda create -n pytorch_env python=3.8”,等待命令执行完成,虚拟环境便创建成功。接着,激活这个虚拟环境,输入 “conda activate pytorch_env”,此时命令行提示符前会显示虚拟环境名称,表明已成功进入该环境。
然后,根据电脑是否配备 NVIDIA GPU 来选择合适的 PyTorch 安装命令。若电脑有 GPU,可先通过 “nvidia-smi” 命令查看 CUDA 版本,再到 PyTorch 官网选择对应的 CUDA 版本进行安装,例如安装支持 CUDA 11.3 的 PyTorch 版本,执行命令:“conda install pytorch torchvision cudatoolkit=11.3 -c pytorch”;若电脑没有 GPU,则执行:“conda install pytorch torchvision cpuonly -c pytorch”。由于之前配置了清华镜像源,这里的 “-c pytorch” 可以省略,conda 会自动从清华镜像源中查找并下载所需的库。
安装完成后,验证 PyTorch 是否安装成功。在激活的虚拟环境中打开 Python 解释器,输入以下代码:
import torch
print(torch.__version__)
print(torch.cuda.is_available())
若能正确输出 PyTorch 的版本号,且当电脑有 GPU 时 “torch.cuda.is_available ()” 返回 True,说明 PyTorch 已成功安装并能正常使用 GPU(若有)。
在 Linux 系统下,安装流程与 Windows 系统有诸多相似之处,同样先安装 Anaconda。从 Anaconda 官网下载 Linux 版本的安装包,如 “Anaconda3-latest-Linux-x86_64.sh”,下载完成后,在终端中进入安装包所在目录,执行以下命令赋予安装包执行权限:“chmod u+x Anaconda3-latest-Linux-x86_64.sh”,然后运行 “./Anaconda3-latest-Linux-x86_64.sh” 开始安装,按照安装提示完成操作,安装完成后,在终端输入 “conda --version” 验证安装。
配置清华镜像源的方式与 Windows 略有不同,在终端中编辑 “~/.condarc” 文件,添加以下内容:
channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
show_channel_urls: true
保存并退出文件,完成镜像源配置。
创建虚拟环境和安装 PyTorch 的步骤与 Windows 系统类似,使用 “conda create -n pytorch_env python=3.8” 创建虚拟环境,激活后根据是否有 GPU 选择相应的安装命令,如 “conda install pytorch torchvision cudatoolkit=11.3 -c pytorch”(有 GPU)或 “conda install pytorch torchvision cpuonly -c pytorch”(无 GPU)。
验证安装同样在激活的虚拟环境中打开 Python 解释器,输入上述验证代码,检查 PyTorch 版本和 GPU 可用性。
在搭建 PyTorch 环境的过程中,还有一些注意事项需要牢记。首先,不同版本的 PyTorch 与 Python、CUDA、cuDNN 之间存在兼容性问题,务必根据官方文档选择匹配的版本组合,以免出现意想不到的错误。其次,安装过程中若遇到网络问题导致下载失败,可尝试多次执行安装命令,或者检查网络连接、防火墙设置等。若使用 conda 安装时速度过慢,除了配置镜像源,还可以尝试更新 conda 版本,有时旧版本的 conda 在下载资源时会出现卡顿现象。最后,若在虚拟环境中使用 Jupyter Notebook 等工具,可能需要额外安装一些插件或进行相关配置,确保工具能够正常识别虚拟环境中的 PyTorch 库。只要按照步骤细心操作,注意这些细节问题,相信大家都能顺利搭建起 PyTorch 的开发环境,开启深度学习的探索之旅。
五、张量与自动求导:PyTorch 的基石
在 PyTorch 的深度学习世界里,张量(Tensor)与自动求导(Automatic Differentiation)无疑是两块最为重要的基石,它们相互协作,支撑起了整个框架的强大功能,为模型的构建、训练与优化提供了坚实的基础。
张量,从概念上讲,是 PyTorch 中最基本的数据结构,它可以被看作是一个多维数组,是标量、向量、矩阵等数学概念向高维空间的自然延伸。就如同在物理学中,标量用于描述只有大小的物理量,如温度;向量用于表示既有大小又有方向的量,像速度;矩阵则适用于处理平面上的变换关系;而在深度学习领域,面对更为复杂的数据和模型结构,张量应运而生,用以承载和处理多样化的数据信息。例如,一张彩色图片在计算机中可以用一个三维张量来表示,其三个维度分别对应着图像的高度、宽度以及 RGB 三个颜色通道;一段文本序列,经过编码后也能以二维或更高维的张量形式输入到模型之中,其中每一维可能代表着不同的语义特征或时间步信息。
PyTorch 中的张量拥有丰富多样的数据类型,以满足不同场景下的计算需求。从数值精度上划分,有 32 位浮点型(torch.float32 或 torch.FloatTensor)、64 位浮点型(torch.float64 或 torch.DoubleTensor)、16 位浮点型(torch.float16 或 torch.HalfTensor),它们适用于不同精度要求的数值计算,像在一些对计算资源敏感但对精度要求稍低的场景中,16 位浮点型就能发挥其存储优势,加速计算过程;整型方面,涵盖了 8 位无符号整型(torch.unit8 或 torch.ByteTensor)、8 位有符号整型(torch.int8 或 torch.CharTensor)、16 位有符号整型(torch.int16 或 torch.ShortTensor)、32 位有符号整型(torch.int32 或 torch.IntTensor)以及 64 位有符号整型(torch.int64 或 torch.LongTensor),不同整型类型在数据索引、计数等场景各显神通,例如在图像像素值的存储中,8 位无符号整型常常被用来表示 0 - 255 之间的像素强度值。并且,这些张量还分为 CPU 张量和 GPU 张量,当系统配备 NVIDIA GPU 时,通过简单的调用方法(如 tensor.cuda ()),就能将 CPU 张量转换为 GPU 张量,充分利用 GPU 的并行计算能力,大幅提升计算速度,为大规模深度学习模型的训练提供有力支持。
对张量的操作也是 PyTorch 的一大亮点,其操作种类繁多且功能强大,与我们熟悉的 NumPy 数组操作有诸多相似之处,这使得有 NumPy 使用经验的开发者能够快速上手。例如,在创建张量时,可以使用 torch.rand () 函数生成指定形状且元素服从 0 - 1 均匀分布的随机张量,就如同在 NumPy 中使用 np.random.rand () 一样;torch.zeros () 和 torch.ones () 则分别用于创建全 0 和全 1 的张量,方便初始化模型参数。在形状变换方面,torch.view () 方法能够在不改变张量数据的前提下,灵活地改变张量的维度排列,如将一个二维张量通过.view (-1) 操作展平为一维张量,其中 “-1” 表示自动根据其他维度信息推断该维度的大小,这在数据预处理和模型输入适配阶段经常用到;而 torch.reshape () 函数虽然也能实现类似功能,但在内存使用和数据共享机制上略有不同,开发者可以根据具体需求选择合适的方法。此外,张量之间还支持丰富的数学运算,如加法、减法、乘法、除法等基本运算,以及矩阵乘法(通过 @运算符或 torch.matmul () 函数)、幂运算、指数运算等更为复杂的数学操作,这些运算在构建神经网络的前向传播过程中发挥着关键作用,能够高效地实现各种复杂的计算逻辑。
自动求导机制则是 PyTorch 的另一大核心优势,它为神经网络的训练提供了强大的自动化梯度计算能力,使得模型能够依据数据自动学习并优化参数。在深度学习中,模型的训练本质上是一个通过不断调整参数,最小化损失函数的过程,而求损失函数对各个参数的梯度则是这一过程的关键步骤。在传统的编程方式中,手动推导和计算梯度是一项极为繁琐且容易出错的任务,尤其是对于复杂的神经网络模型而言,其计算复杂度呈指数级增长。PyTorch 的自动求导机制巧妙地解决了这一难题,它基于动态计算图(Dynamic Computational Graph)实现,为深度学习带来了极大的便利与高效性。
当在 PyTorch 中创建一个张量并设置其 requires_grad=True 时,PyTorch 便会开启对该张量的自动求导追踪。此后,对这个张量进行的所有操作,无论是简单的数学运算,还是复杂的函数调用,都会被自动记录在一个动态构建的计算图中。这个计算图以节点表示操作,边表示数据流向,精准地记录了张量从输入到输出的整个计算过程。例如,当执行 x = torch.tensor ([2.0], requires_grad=True),y = x ** 2,z = 3 * y 这样的操作序列时,PyTorch 会在后台构建一个包含乘法、平方等操作节点的计算图,清晰地展现出 z 是如何从 x 一步步计算得到的。
一旦完成了前向传播计算,得到了最终的输出(通常是损失函数的值),此时只需调用.backward () 方法,PyTorch 便会自动依据构建好的计算图,从输出端开始,运用链式法则(Chain Rule)逆向传播梯度,高效且准确地计算出每个张量相对于损失函数的梯度,并将这些梯度值存储在对应张量的.grad 属性中。以一个简单的线性回归模型为例,假设模型为 y_pred = w * x + b,其中 w 和 b 是需要学习的参数(均为张量且设置 requires_grad=True),给定输入数据 x 和真实标签 y,通过计算损失函数 loss = ((y_pred - y) ** 2).mean (),然后调用 loss.backward (),PyTorch 就能自动算出 w 和 b 的梯度 w.grad 和 b.grad,开发者随后便可利用这些梯度值,按照一定的优化算法(如随机梯度下降法)对参数进行更新,使得模型在下次预测时能够更加接近真实值,如此反复迭代,实现模型的逐步优化。
值得注意的是,在实际训练过程中,由于梯度在每次反向传播时都会累积,如果不加以处理,会导致梯度值越来越大或越来越小,影响模型的收敛效果。因此,通常在每次迭代开始前,需要使用 optimizer.zero_grad () 方法将梯度清零,以确保本次迭代的梯度计算不受上一次迭代的影响,保证模型训练的稳定性与准确性。
综上所述,张量作为数据的承载基石,自动求导作为模型优化的关键动力,二者紧密结合,相得益彰,共同铸就了 PyTorch 在深度学习领域强大而灵活的特性,让研究者和开发者能够高效地探索、构建与训练各类复杂的神经网络模型,为解决诸多现实世界中的复杂问题提供了有力支持。
六、神经网络构建实战
在深度学习的广袤天地中,构建神经网络犹如搭建一座精密的智慧大厦,而 PyTorch 则为我们提供了一套完备且强大的工具包,让这座大厦能够拔地而起,绽放出智能的光芒。接下来,我们将深入探究如何运用 PyTorch 构建神经网络,开启一场从理论到实践的精彩旅程。
(一)构建模块剖析
在 PyTorch 中,神经网络的构建依托于torch.nn模块,这一模块宛如一个装满各类积木的神奇盒子,里面包含了构建神经网络所需的各种基本组件,如线性层(nn.Linear)、卷积层(nn.Conv2d等)、池化层(nn.MaxPool2d等)、激活函数(nn.ReLU、nn.Sigmoid等)、全连接层(本质上也是线性层)以及各种规范化层(nn.BatchNorm2d等)。这些组件各自承担着独特的功能,相互协作,共同塑造出神经网络的强大能力。
线性层,作为神经网络的基础构成单元之一,主要负责对输入数据进行线性变换。以nn.Linear(in_features, out_features, bias=True)为例,in_features指定了输入数据的特征维度,out_features则定义了输出数据的特征维度,而bias参数决定是否为该线性层添加偏置项。在一个简单的全连接神经网络中,数据从输入层依次经过多个隐藏层的线性变换,逐步提取特征、抽象信息,最终到达输出层,完成模型的预测任务。
卷积层则是计算机视觉领域的得力助手,擅长捕捉图像中的局部特征。例如nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True),其中in_channels代表输入图像的通道数,如常见的彩色图像为 3 通道(RGB),灰度图像为 1 通道;out_channels决定了卷积核的数量,也就是卷积后输出特征图的通道数,不同的卷积核能够提取不同的特征;kernel_size定义了卷积核的大小,其取值直接影响着感受野的大小,进而影响特征提取的粒度;stride控制卷积核在图像上滑动的步长,padding用于在图像边缘填充 0,确保卷积操作后图像尺寸的一致性,这些参数的巧妙组合,使得卷积层能够高效地从图像数据中挖掘出丰富的特征信息。
池化层的主要作用是对特征图进行降维,减少数据量,同时保留关键特征,提高计算效率。nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)便是常用的最大池化层,它在给定的窗口(kernel_size)内选取最大值作为输出,通过这种方式,能够突出图像中的显著特征,降低后续计算的复杂度。
激活函数则为神经网络注入了非线性因素,赋予模型强大的表达能力。像nn.ReLU()(Rectified Linear Unit,修正线性单元),它将输入小于 0 的值置为 0,大于 0 的值保持不变,其简单高效的特性使得它在众多神经网络中被广泛应用,有效避免了梯度消失问题,加快了模型的训练速度;nn.Sigmoid()函数则能将输入值映射到 0 - 1 之间,常用于二分类问题的输出层,将模型的输出转化为概率值,便于理解与判断。
这些组件在nn.Module的统领下,有机结合,构成了复杂多样的神经网络结构。
(二)模型定义之道
在 PyTorch 中,定义一个神经网络模型需遵循特定的规则,其核心是继承nn.Module基类,并实现__init__和forward方法。__init__方法就像是模型的蓝图绘制阶段,在这个方法中,我们需要实例化各种层组件,确定模型的结构框架;而forward方法则是模型的实际运行逻辑,它详细描述了数据在模型中的流动路径,即前向传播过程,从输入数据进入模型,依次经过各个层的处理,最终输出预测结果。
以一个简单的手写数字识别模型为例,我们可以定义一个如下的类:
import torch.nn as nnclass SimpleMNISTNet(nn.Module):def __init__(self):super(SimpleMNISTNet, self).__init__()self.conv1 = nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1)self.relu1 = nn.ReLU()self.pool1 = nn.MaxPool2d(2)self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)self.relu2 = nn.ReLU()self.pool2 = nn.MaxPool2d(2)self.flatten = nn.Flatten()self.fc1 = nn.Linear(32 * 7 * 7, 128)self.relu3 = nn.ReLU()self.fc2 = nn.Linear(128, 10)def forward(self, x):x = self.conv1(x)x = self.relu1(x)x = self.pool1(x)x = self.conv2(x)x = self.relu2(x)x = self.pool2(x)x = self.flatten(x)x = self.fc1(x)x = self.relu3(x)x = self.fc2(x)return x
在上述代码中,__init__方法首先调用父类nn.Module的__init__方法完成初始化,接着依次定义了两个卷积层、两个 ReLU 激活函数、两个最大池化层、一个扁平化层以及两个全连接层。在forward方法中,数据x按照定义的顺序依次经过各个层的处理,最终输出模型对输入图像的预测结果,这里输出维度为 10,对应着 0 - 9 十个数字的分类概率。
(三)层与模块的灵活运用
nn.Module类及其衍生的各种层类为模型构建提供了极大的灵活性。除了上述直接定义层的方式,还可以使用nn.Sequential容器来快速搭建模型。nn.Sequential就像是一条流水线,按照传入的顺序依次执行各个模块的操作,它可以接收一系列的层或模块作为参数,自动将它们按顺序连接起来。
例如,将之前定义的SimpleMNISTNet模型部分使用nn.Sequential改写:
import torch.nn as nnclass SimpleMNISTNet(nn.Module):def __init__(self):super(SimpleMNISTNet, self).__init__()self.features = nn.Sequential(nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1),nn.ReLU(),nn.MaxPool2d(2),nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1),nn.ReLU(),nn.MaxPool2d(2))self.classifier = nn.Sequential(nn.Flatten(),nn.Linear(32 * 7 * 7, 128),nn.ReLU(),nn.Linear(128, 10))def forward(self, x):x = self.features(x)x = self.classifier(x)return x
在这个改写后的模型中,将特征提取部分和分类部分分别封装在两个nn.Sequential容器中,使得模型结构更加清晰,代码也更为简洁。同时,在构建复杂模型时,还可以嵌套使用nn.Sequential,进一步优化模型的组织结构。
另外,对于一些具有重复结构的模型,如残差网络(ResNet)中的残差块,可以定义一个单独的类来表示,然后在主模型中多次实例化并组合这些模块,充分体现了 PyTorch 在构建复杂神经网络时的高度灵活性与可扩展性,让研究者能够轻松尝试各种创新的网络架构。
(四)参数初始化技巧
在构建神经网络后,参数初始化是一个至关重要的环节,它直接影响着模型的训练效果与收敛速度。PyTorch 提供了多种参数初始化方法,主要通过nn.init模块来实现。
常见的初始化方法有随机初始化、零初始化、正态分布初始化、均匀分布初始化以及一些针对特定网络结构优化的初始化方法,如 Xavier 初始化和 Kaiming 初始化。
随机初始化是最为常见的默认方式,在创建层时,PyTorch 会自动为权重参数进行随机赋值,使得模型在初始状态下具有一定的多样性。但这种随机初始化可能会导致模型在训练初期收敛不稳定,因此有时需要更精细的初始化策略。
零初始化通常用于偏置项,将偏置初始化为 0,在某些情况下可以简化模型的初始状态,避免不必要的偏差影响。
正态分布初始化则是从均值为 0、标准差为指定值的正态分布中随机采样来初始化权重参数,例如nn.init.normal_(tensor, mean=0, std=1),可以根据模型的需求调整标准差,控制参数的初始分布范围,一般在一些对参数尺度敏感的模型中较为常用。
均匀分布初始化,如nn.init.uniform_(tensor, a=-0.1, b=0.1),从指定的区间[a, b]内均匀采样来初始化权重,它能够保证参数在初始阶段具有相对均匀的分布,避免出现过大或过小的初始值影响训练。
Xavier 初始化,也称为 Glorot 初始化,旨在使得各层的激活值和梯度的方差在传播过程中保持一致,对于不同的层类型(如线性层、卷积层)有相应的实现函数,像nn.init.xavier_normal_(layer.weight)用于正态分布的 Xavier 初始化,它能有效缓解梯度消失或爆炸问题,提高模型训练的稳定性,尤其适用于深度神经网络。
Kaiming 初始化,又称 HE 初始化,是针对 ReLU 激活函数设计的初始化方法,分为正态分布和均匀分布两种形式,如nn.init.kaiming_normal_(layer.weight, mode=‘fan_in’, nonlinearity=‘relu’),它能够根据 ReLU 函数的特性,合理设置权重的初始值,使得模型在训练时能够更快地收敛,在使用 ReLU 作为激活函数的网络中表现出色。
在实际应用中,通常会在模型定义后,针对不同的层选择合适的初始化方法,例如:
import torch.nn as nn
import torch.nn.init as initclass MyNet(nn.Module):def __init__(self):super(MyNet, self).__init__()self.fc1 = nn.Linear(100, 50)self.fc2 = nn.Linear(50, 10)# 使用Kaiming初始化fc1的权重init.kaiming_normal_(self.fc1.weight, mode='fan_in', nonlinearity='relu')# 使用Xavier初始化fc2的权重init.xavier_normal_(self.fc2.weight)def forward(self, x):x = self.fc1(x)x = self.fc2(x)return x
通过合理的参数初始化,为模型的训练打下坚实的基础,让模型在后续的学习过程中能够更加高效地优化参数,逼近最优解。
(五)模型训练与优化实战
构建好模型后,便进入了关键的训练与优化阶段。这一过程如同雕琢一件艺术品,需要精心调整各种参数与策略,让模型逐步拟合数据,展现出强大的预测能力。
首先,需要确定损失函数(Loss Function)和优化器(Optimizer)。损失函数用于衡量模型预测结果与真实标签之间的差异,常见的损失函数有均方误差损失(nn.MSELoss)用于回归任务,交叉熵损失(nn.CrossEntropyLoss)适用于分类任务等。优化器则负责根据损失函数计算得到的梯度,更新模型的参数,以减小损失值,常见的优化器包括随机梯度下降(SGD,optim.SGD)及其变种 Adagrad、Adadelta、Adam(optim.Adam)等,不同的优化器在学习率调整策略、动量项等方面各有特点,适用于不同的场景。
以下是一个使用 MNIST 数据集训练手写数字识别模型的完整示例代码:
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader# 定义模型
class SimpleMNISTNet(nn.Module):def __init__(self):super(SimpleMNISTNet, self).__init__()self.features = nn.Sequential(nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1),nn.ReLU(),nn.MaxPool2d(2),nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1),nn.ReLU(),nn.MaxPool2d(2))self.classifier = nn.Sequential(nn.Flatten(),nn.Linear(32 * 7 * 7, 128),nn.ReLU(),nn.Linear(128, 10))def forward(self, x):x = self.features(x)x = self.classifier(x)return x# 数据预处理与加载
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)# 实例化模型、损失函数和优化器
model = SimpleMNISTNet()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
def train(model, train_loader, criterion, optimizer, epochs):for epoch in range(epochs):running_loss = 0.0for i, (images, labels) in enumerate(train_loader):optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if (i + 1) % 100 == 0:print(f'Epoch [{epoch + 1}/{epochs}], Step [{i + 1}/{len(train_loader)}], Loss: {running_loss / 100:.4f}')running_loss = 0.0# 测试模型
def test(model, test_loader):correct = 0total = 0with torch.no_grad():for images, labels in test_loader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Accuracy on test set: {100 * correct / total:.2f}%')# 执行训练与测试
train(model, train_loader, criterion, optimizer, epochs=5)
test(model, test_loader)
在上述代码中,首先定义了SimpleMNISTNet模型,接着通过torchvision模块下载并预处理 MNIST 数据集,将其加载为数据加载器(DataLoader),以便在训练过程中按批次提供数据。然后实例化了模型、交叉熵损失函数和 Adam 优化器,在训练循环中,每个批次的数据经过模型前向传播得到预测结果,计算损失后通过反向传播更新模型参数,优化器按照设定的学习率调整策略对参数进行优化,经过多个轮次(epochs)的训练,模型逐渐收敛。最后在测试阶段,使用测试集评估模型的准确率,直观地展示模型的性能表现。
在模型训练过程中,还可以采用一些技巧来进一步提升效果,如学习率调整策略,随着训练的进行,适当降低学习率,避免模型在后期跳过最优解,常见的方法包括学习率衰减(如每经过一定轮次,将学习率乘以一个小于 1 的衰减因子)、使用lr_scheduler模块中的StepLR、CosineAnnealingLR等策略,动态调整学习率,让模型训练更加平稳高效;另外,正则化技术,如 L1、L2 正则化,能够防止模型过拟合,增强模型的泛化能力,通过在损失函数中添加正则项,约束模型参数的取值范围,避免模型过于复杂而对训练数据过度拟合,从而在测试数据上也能有较好的表现。
通过以上完整的神经网络构建、训练与优化流程,利用 PyTorch 强大的功能与丰富的工具,我们能够应对各种复杂的深度学习任务,从图像识别到自然语言处理,从语音识别到推荐系统,让智能算法在不同领域落地生根,为解决实际问题提供强有力的支持。
七、PyTorch 多领域应用实例剖析
PyTorch 作为深度学习领域的得力工具,在众多领域中都展现出了强大的应用潜力,推动着技术的革新与突破。接下来,让我们深入探究 PyTorch 在几个关键领域的精彩应用实例,领略其带来的无限可能。
在计算机视觉领域,图像分类是一项基础且至关重要的任务,而 PyTorch 让这一任务变得更加高效与精准。以经典的 MNIST 手写数字识别为例,通过构建如前文所述的卷积神经网络模型,利用 PyTorch 简洁的 API,能够轻松地实现模型的定义、训练与评估。在实际应用中,只需短短几分钟的训练,模型就能在测试集上达到超过 95% 的准确率,准确地识别出图像中的手写数字,为数字识别相关的应用场景,如自动化表单处理、数字验证码识别等提供了可靠的技术支持。
目标检测同样是计算机视觉的核心任务之一,在安防监控、自动驾驶等领域有着广泛应用。基于 PyTorch 的目标检测框架,如 Faster R-CNN、YOLO 等,能够对图像或视频中的各类目标进行精准定位与识别。以智能安防监控系统为例,利用这些基于 PyTorch 开发的目标检测模型,可以实时监测监控画面中的人员、车辆、异常物体等,及时发出警报,保障区域安全。代码实现上,通过加载预训练的目标检测模型权重,对输入的视频流逐帧进行处理,获取目标的类别、位置信息,并在画面上绘制框线标注,直观展示检测结果。
图像生成则展现了 PyTorch 的创造性一面。生成对抗网络(GAN)在 PyTorch 的助力下,能够生成以假乱真的图像。例如,使用 DCGAN 模型生成逼真的人脸图像,其生成器网络将随机噪声逐渐转化为具有人脸特征的图像,判别器网络则不断优化,提升对真假人脸的判别能力,二者在对抗训练中共同进步。在艺术创作、虚拟形象生成等领域,创作者们利用 PyTorch 实现的 GAN 模型,能够快速生成各种风格独特的人脸图像,为创意表达提供了丰富素材,激发无限灵感。
自然语言处理作为人工智能的重要分支,同样离不开 PyTorch 的身影。文本分类是常见的 NLP 任务,如新闻分类、情感分析等。以 IMDB 影评情感分析为例,借助 PyTorch 的文本处理工具和预训练模型,构建循环神经网络(RNN)或 Transformer 模型,对影评文本进行特征提取与分类。经过在大规模影评数据集上的训练,模型能够准确判断影评的情感倾向,为电影制作方、营销人员提供有价值的市场反馈,帮助观众快速筛选感兴趣的影片。
机器翻译更是打破了语言的隔阂,实现跨语言交流。基于 PyTorch 开发的神经机器翻译模型,如 Transformer-based 模型,利用多头注意力机制捕捉文本中的语义信息,实现高效的文本翻译。在国际交流、跨境电商等场景中,这些模型能够实时翻译文本,促进信息流通,让沟通变得畅通无阻。代码层面,通过对大量平行语料的学习,模型掌握语言之间的转换规律,在推理阶段快速生成目标语言文本。
问答系统也是自然语言处理的重要应用方向,它旨在为用户提供准确、智能的问题回答。基于 PyTorch 构建的问答模型,如 BERT-based 问答模型,能够理解问题的语义,并在知识库或文本中寻找精准答案。在智能客服领域,企业利用这类问答系统,快速响应用户咨询,提高客户满意度,降低人力成本,实现 24/7 全天候服务。
生成对抗网络在自然语言处理中同样有着独特的应用,如文本生成。通过构建生成器与判别器,生成器尝试生成连贯、语义合理的文本,判别器判断文本的真实性,二者对抗训练。以故事生成场景为例,给定一个主题或开头,模型能够利用 PyTorch 的强大功能,生成情节丰富、逻辑连贯的故事文本,为文学创作、内容生成提供新颖思路,激发创作者的想象力。
强化学习与 PyTorch 的结合更是为智能决策带来了新的突破。以机器人控制为例,在模拟环境中,利用 PyTorch 搭建强化学习模型,机器人作为智能体,通过不断与环境交互,尝试各种动作,根据获得的奖励反馈学习最优策略,以实现导航、抓取等任务。代码实现时,定义机器人的状态空间、动作空间,基于策略网络或价值网络,利用 PyTorch 的优化器进行参数更新,使机器人逐渐掌握高效的任务执行策略。
游戏 AI 也是强化学习的重要应用领域。在电子游戏中,基于 PyTorch 的强化学习算法让游戏角色能够自主学习战斗、探索等策略,提升游戏的趣味性与挑战性。例如,训练游戏角色在复杂的游戏地图中自动寻路、躲避障碍、击败敌人,通过不断试错与学习,适应不同的游戏场景,为玩家带来更加智能、富有变化的游戏体验。
通过这些多领域的应用实例可以清晰地看到,PyTorch 凭借其强大的功能、灵活的架构以及丰富的工具库,在计算机视觉、自然语言处理、生成对抗网络、强化学习等诸多领域都发挥着关键作用,为解决实际问题、推动技术创新提供了坚实的支撑,助力开发者与研究者在不同领域创造出更多卓越的成果,开启智能时代的无限可能。
八、学习 PyTorch 的进阶之路
在探索 PyTorch 的征程中,我们已然领略了其强大的功能与广泛的应用领域,然而学习之路漫漫,如何更上一层楼,成为真正的 PyTorch 高手呢?接下来,为大家分享一些宝贵的进阶指南。
学习资料宛如指引方向的明灯,丰富多样且优质的资料能让我们的学习事半功倍。首先,PyTorch 官方文档堪称 “宝典”,它详细且全面地涵盖了从基础概念到高级特性的所有内容,无论是函数的使用说明,还是模型构建的最佳实践,都能在其中找到精准答案,并且随着版本更新实时迭代,确保知识的时效性。对于喜欢深入钻研理论的朋友,《Deep Learning with PyTorch》这本书籍不容错过,它由浅入深地剖析 PyTorch 原理,配合大量生动案例与直观插图,将复杂知识简单化,助您筑牢理论根基。在线课程方面,Coursera、Udemy 等平台上诸多由业内专家授课的 PyTorch 专项课程,从基础入门到实战项目应有尽有,通过系统学习与互动答疑,让知识掌握得更加扎实。而在技术社区,如 Stack Overflow、GitHub,汇聚着全球开发者分享的代码示例、问题解决方案以及前沿探索心得,日常逛逛,总能发现新的灵感与技巧。
学习方法则是开启知识宝库的钥匙。实践出真知,务必多动手敲代码,从简单的线性回归、手写数字识别模型开始,逐步挑战复杂的目标检测、语义分割等项目,在代码实践中加深对 PyTorch API 的理解,熟悉模型构建与优化流程。遇到问题时,善用调试工具,结合动态计算图特性,逐行排查问题,将错误视为成长的阶梯。同时,积极复现经典论文中的模型,如 Transformer、GAN 等,不仅能深入理解前沿算法思想,还能学习到顶级研究者的代码风格与技巧,站在巨人肩膀上前行。另外,建立知识体系至关重要,将张量操作、神经网络架构、训练优化等知识点串联起来,形成完整的知识网络,遇到实际问题时便能迅速定位所需知识,灵活运用解决。
参与社区是进阶路上不可或缺的一环。PyTorch 社区就像一个温暖且充满智慧的大家庭,加入其中,能与全球同行交流切磋。在论坛中积极参与讨论,分享自己的见解与经验,也能从他人的分享中获得启发,拓宽视野;在 GitHub 上关注热门项目,为开源项目贡献代码,无论是修复一个小 Bug,还是添加一项新功能,都能在提升技术实力的同时,积累宝贵的项目经验,还能结识志同道合的朋友,共同探索技术的边界。
深度学习领域发展日新月异,持续学习是保持竞争力的关键。定期关注 arXiv、CVPR、ICLR 等学术平台,了解最新的研究成果,紧跟技术潮流,不断将新知识融入自己的知识体系,尝试应用于实际项目中,实现知识的迭代升级。
学习 PyTorch 是一场充满挑战与惊喜的旅程,只要我们怀揣热情,善用学习资料,掌握科学方法,积极投身社区,坚持持续学习,定能在深度学习的天空中展翅翱翔,用 PyTorch 创造出更多精彩,为智能时代的发展添砖加瓦。愿大家都能在这条路上收获满满,成长为深度学习领域的中流砥柱!
九、PyTorch 未来展望
展望未来,PyTorch 有望在多个维度持续突破,为深度学习领域注入源源不断的活力,引领智能技术迈向新的高峰。
在与新兴技术融合方面,PyTorch 将与量子计算紧密携手,借助量子计算超乎想象的并行计算能力,处理传统计算机难以企及的复杂任务,大幅缩短模型训练时间,加速科学研究进程,像量子化学模拟、复杂物理系统建模等领域将迎来变革。同时,与边缘计算的融合会让智能无处不在,通过优化模型在边缘设备上的运行效率,实现实时、低延迟的智能应用,如智能家居设备、自动驾驶汽车等,即便在网络不佳环境下也能智能决策,提升用户体验。
性能优化是 PyTorch 永恒的追求。其团队致力于进一步提升训练和推理速度,通过创新的编译器技术、内存管理优化以及对新硬件架构的深度适配,让模型运行如闪电般迅猛。在处理超大规模数据集和复杂模型时,将轻松应对,减少资源消耗,为科研与产业发展提供强大动力,推动如气候模拟、基因测序分析等大规模复杂任务的高效完成。
应用拓展领域,PyTorch 将在医疗健康领域大放异彩。助力精准医疗,从医学影像诊断,精准识别病症细微特征辅助医生判断,到药物研发,通过模拟药物分子与靶点作用加速新药开发,为人类健康保驾护航。在智能交通系统构建上,赋能城市交通流量优化,实时调控信号灯;提升自动驾驶安全性与可靠性,应对复杂路况,让出行更畅通、安全。
随着技术的演进,PyTorch 社区也将愈发繁荣昌盛。全球开发者、研究者将汇聚于此,分享前沿成果、开源优质项目,形成强大的知识共享网络。新手能快速入门汲取经验,老手能探索创新突破边界,共同推动 PyTorch 生态蓬勃发展,持续拓展深度学习技术的无限可能,开启智能未来新篇章。
相关文章:
《PyTorch:从基础概念到实战应用》
《PyTorch:从基础概念到实战应用》 一、PyTorch 初印象二、PyTorch 之历史溯源三、PyTorch 核心优势尽显(一)简洁高效,契合思维(二)易于上手,调试便捷(三)社区繁荣&#…...
前端:改变鼠标点击物体的颜色
需求: 需要改变图片中某一物体的颜色,该物体是纯色; 鼠标点击哪个物体,哪个物体的颜色变为指定的颜色,利用canvas实现。 演示案例 代码Demo <!DOCTYPE html> <html lang"en"><head>&l…...
Java-33 深入浅出 Spring - FactoryBean 和 BeanFactory BeanPostProcessor
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
HTML4笔记
尚硅谷 一、前序知识 1.认识两位先驱 2.计算机基础知识 3.C/S架构与B/S架构 4.浏览器相关知识 5.网页相关概念 二、HTML简介 1.什么是HTML? 2.相关国际组织(了解) 3.HTML发展历史(了解)** 三、准备工作 1.常用电脑设置 2.安装Chrome浏览器 四、HTML入门 1.HTML初体验 2.H…...
python报错ModuleNotFoundError: No module named ‘visdom‘
在用虚拟环境跑深度学习代码时,新建的环境一般会缺少一些库,而一般解决的方法就是直接conda install,但是我在conda install visdom之后,安装是没有任何报错的,conda list里面也有visdom的信息,但是再运行代…...
linux-21 目录管理(一)mkdir命令,创建空目录
对linux而言,对一个系统管理来讲,最关键的还是文件管理。那所以我们接下来就来看看如何实现文件管理。当然,在文件管理之前,我们说过,文件通常都放在目录下,对吧?所以先了解目录,可能…...
总结-常见缓存替换算法
缓存替换算法 1. 总结 1. 总结 常见的缓存替换算法除了FIFO、LRU和LFU还有下面几种: 算法优点缺点适用场景FIFO简单实现可能移除重要数据嵌入式系统,简单场景LRU局部性原理良好维护成本高,占用更多存储空间内存管理,浏览器缓存L…...
【Vue】如何在 Vue 3 中使用组合式 API 与 Vuex 进行状态管理的详细教程
如何在 Vue 3 中使用组合式 API 与 Vuex 进行状态管理的详细教程。 安装 Vuex 首先,在你的 Vue 3 项目中安装 Vuex。可以使用 npm 或 yarn: npm install vuexnext --save # or yarn add vuexnext创建 Store 在 Vue 3 中,你可以使用 creat…...
VSCode 插件开发实战(十五):如何支持多语言
前言 在软件开发中,多语言支持(i18n)是一个非常重要的功能。无论是桌面应用、移动应用,还是浏览器插件,都需要考虑如何支持不同国家和地区的用户,软件应用的多语言支持(i18n)已经成…...
面试241228
面试可参考 1、cas的概念 2、AQS的概念 3、redis的数据结构 使用场景 不熟 4、redis list 扩容流程 5、dubbo 怎么进行服务注册和调用,6、dubbo 预热 7如何解决cos上传的安全问题kafka的高并发高吞吐的原因ES倒排索引的原理 spring的 bean的 二级缓存和三级缓存 spr…...
Python数据序列化模块pickle使用
pickle 是 Python 的一个标准库模块,它实现了基本的对象序列化和反序列化。序列化是指将对象转换为字节流的过程,这样对象就可以被保存到文件中或通过网络传输。反序列化是指从字节流中恢复对象的过程。 以下是 pickle 模块的基本使用方法: …...
Spring Boot对访问密钥加解密——HMAC-SHA256
HMAC-SHA256 简介 HMAC-SHA256 是一种基于 哈希函数 的消息认证码(Message Authentication Code, MAC),它结合了哈希算法(如 SHA-256)和一个密钥,用于验证消息的完整性和真实性。 HMAC 是 “Hash-based M…...
HTML 元素:网页构建的基础
HTML 元素:网页构建的基础 HTML(HyperText Markup Language,超文本标记语言)是构建网页的基石。它定义了网页的结构和内容,而HTML元素则是构成HTML文档的基石。在本篇文章中,我们将深入探讨HTML元素的概念、类型、用法,以及如何在网页设计中有效地使用它们。 什么是HT…...
HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?
在 iPhone 拍摄照片时,默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点,但在某些设备或软件上可能存在兼容性问题。因此,将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂…...
爆肝1个月:DDR4 的信号完整性(万字长文SI)
前言: 大学里面,总有很多课程,很浪费时间,学了没点用处,问过老师,为什么信号完整性,示波器使用等课程不开呢,这种是对工作真实有帮助的? 老师:因为老师…...
前端js验证码插件
相关代码,在最上方的绑定资源...
关于easy-es对时间范围查询遇到的小bug
前言:在使用easy-es之前作为一个小白的我只有es原生查询的基础,在自己通过查看官方文档自学easy-es遇到了一个挫折,其他的还好语法和MybatisPlus差不多,正以为我觉得很快就能入手,在对时间范围的判断就给我当头一棒&am…...
Mask R-CNN
目录 摘要 Abstract Mask R-CNN 网络架构 Backbone RPN Proposal Layer ROIAlign bbox检测 Mask分割 损失计算 实验复现 总结 摘要 Mask R-CNN是在Faster R-CNN的基础上进行改进的目标检测和实例分割网络。Faster R-CNN主要用于目标检测,输出对象的边…...
大模型-Dify使用笔记
大模型-Dify使用笔记 0、调整docker镜像源1、安装1、Docker Compose方式部署 2、访问 Dify 0、调整docker镜像源 由于墙的存在,所以默认的docker镜像源很难拉取项目,需要调整相关的docker配置文件 vim /etc/docker/daemon.json添加如下docker镜像源 { …...
Suno Api V4模型无水印开发「综合实战开发自己的音乐网站」 —— 「Suno Api系列」第14篇
历史文章 Suno AI API接入 - 将AI音乐接入到自己的产品中,支持120并发任务 Suno Api V4模型无水印开发「灵感模式」 —— 「Suno Api系列」第1篇 Suno Api V4模型无水印开发「自定义模式」 —— 「Suno Api系列」第2篇 Suno Api V4模型无水印开发「AI生成歌词」…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
