当前位置: 首页 > news >正文

pytorch计算图Computation_graph是什么

文章目录

  • 一、AI系统中的计算图(宏观)
  • 二、动态计算图(微观)
    • 2.1 张量计算图
    • 2.2 计算图的定义
    • 2.3 节点类型
    • 2.4 计算图的动态性
    • 2.5 计算图的正向传播是立即执行的
    • 2.6 计算图在反向传播后立即销毁
    • 2.7 计算图中的Function
    • 2.8 计算图与反向传播
    • 2.9 叶子节点和非叶子节点
  • 三、计算图在TensorBoard中的可视化
  • 总结

引言:计算图(数据流图)类似于数学中的流程图和数据结构中的图

一、AI系统中的计算图(宏观)

在这里插入图片描述

为各类神经网络计算提供统一的描述

  • 基本数据结构 :Tensor 张量(边)

  • 基本运算单元:Operator 算子(节点)

  1. 由最基本的代数算子组成
  2. 根据深度学习结构组成复杂算子
  3. N个输入Tensor,M个输出Tensor

深度学习训练流程主要计算阶段:
1.前向计算;
2.反向计算;
3.更新可学习的权重参数
自动微分:原子操作构成的复杂前向计算程序,关注自动生成高效的反向计算程序
在这里插入图片描述

二、动态计算图(微观)

Pytorch的计算图由节点和边组成,节点表示张量或者Function,边表示张量和Function之间的依赖关系。

Pytorch中的计算图是动态图。这里的动态主要有两重含义。

第一层含义是:计算图的正向传播是立即执行的。无需等待完整的计算图创建完毕,每条语句都会在计算图中动态添加节点和边,并立即执行正向传播得到计算结果。

第二层含义是:计算图在反向传播后立即销毁。下次调用需要重新构建计算图。如果在程序中使用了backward方法执行了反向传播,或者利用torch.autograd.grad方法计算了梯度,那么创建的计算图会被立即销毁,释放存储空间,下次调用需要重新创建。

dtype 该张量存储的值类型,可选类型见:torch.dtype
device 该张量存放的设备类型,cpu/gpu
data 该张量节点存储的值
requires_grad 表示autograd时是否需要计算此tensor的梯度,默认Falsegrad存储梯度的值,初始为None
grad_fn反向传播时,用来计算梯度的函数
is_leaf 该张量节点在计算图中是否为叶子节点

  1. 输入数据
  2. 建立模型
  3. 定义损失函数和训练方法
  4. 初始化和启动TensorFlow会话
  5. 训练

2.1 张量计算图

张量本身也支持微分计算。这种可微分性其实不仅体现在我们可以使用grad函数对其进行可导,更重要的是这种可微分性会体现在可微分张量参与的所有运算中

import numpy as np
import torch 

requires_grad属性:可微分性

#构建可微分张量
x = torch.tensor(1., requires_grad=True)
x
tensor(1., requires_grad=True)
#构建函数关系
y = x ** 2
y
tensor(1., grad_fn=<PowBackward0>)

grad_fn属性:存储Tensor微分函数
我们发现,此时张量y具有了一个grad_fn属性,并且取值为,我们可以查看该属性

y.grad_fn #y的梯度函数是平方函数
<PowBackward0 at 0x1521ce260>

grad_fn其实是存储了一个Tensor的微分函数,或者说grad_fn存储了可微分张量在进行计算的过程中函数关系,此处x到y其实就是进行了幂运算

#但x作为初始张量,并没有grad_fn 属性
x.grad_fn #None

也就是相当于x,y不仅同样拥有张量的取值,并且同样可微,还额外存储了x到y的函数计算信息,我们再尝试围绕y创建新的函数关系,z=y+1

z = y + 1
z
tensor(2., grad_fn=<AddBackward0>)
z.requires_grad #True
True
z.grad_fn #加法函数
<AddBackward0 at 0x1521cc430>

不难发现,z也同时存储了张量计算数值、z是可微的,并且z还存储了和y的计算关系(add)。据此我们可以知道,在PyTorch的张量计算过程中,如果我们设置初始张量是可微的,则在计算过程中,每一个由原张量计算得出的新张量都是可微的,并且还会保存此前一步的函数关系,这也就是所谓的回溯机制。而根据这个回溯机制,我们就能非常清楚掌握张量的每一步计算,并据此绘制张量计算图。

借助回溯机制,我们就能将张量的复杂计算过程抽象为一张图(Graph),例如此前我们定义的x、、z三个张量,三者的计算关系就可以由下图进行表示。
在这里插入图片描述

2.2 计算图的定义

上图就是用于记录可微分张量计算关系的张量计算图,图由节点和有向边构成,其中节点表示张量,边表示函数计算关系,方向则表示实际运算方向,张量计算图本质是有向无环图。

2.3 节点类型

在张量计算图中,虽然每个节点都表示可微分张量,但节点和节点之间却略有不同。就像在前例中,y和z保存了函数计算关系,但x没有,而在实际计算关系中,我们不难发现z是所有计算的终点,因此,虽然x、y、都是节点,但每个节点却并不一样。此处我们可以将节点分为三类,分别是:
a):叶节点,也就是初始输入的可微分张量,前例中x就是叶节点;
b):输出节点,也就是最后计算得出的张量,前例中z就是输出节点;
c):中间节点,在一张计算图中,除了叶节点和输出节点,其他都是中间节点,前例中y就是中间节点。
当然,在一张计算图中,可以有多个叶节点和中间节点,但大多数情况下,只有一个输出节点,若存在多个输出结果,我们也往往会将其保存在一个张量中。

2.4 计算图的动态性

值得一提的是,PyTorch的计算图是动态计算图,会根据可微分张量的计算过程自动生成,并且伴随着新张量或运算的加入不断更新,这使得PyTorch的计算图更加灵活高效,并且更加易于构建,相比于先构件图后执行计算的部分框架(如老版本的TensorFlow),动态图也更加适用于面向对象编程。
在这里插入图片描述

2.5 计算图的正向传播是立即执行的

import torch 
w = torch.tensor([[3.0,1.0]],requires_grad=True)
b = torch.tensor([[3.0]],requires_grad=True)
X = torch.randn(10,2)
Y = torch.randn(10,1)
Y_hat = X@w.t() + b  # Y_hat定义后其正向传播被立即执行,与其后面的loss创建语句无关
loss = torch.mean(torch.pow(Y_hat-Y,2)) #mean是均值函数,pow是幂函数 print(loss.data)
print(Y_hat.data)
tensor(29.3997)
tensor([[4.0577],[4.0333],[1.8358],[0.8279],[7.7642],[9.1330],[9.1387],[2.9540],[1.9430],[1.0640]])

2.6 计算图在反向传播后立即销毁

import torch 
w = torch.tensor([[3.0,1.0]],requires_grad=True)
b = torch.tensor([[3.0]],requires_grad=True)
X = torch.randn(10,2)
Y = torch.randn(10,1)
Y_hat = X@w.t() + b  # Y_hat定义后其正向传播被立即执行,与其后面的loss创建语句无关
loss = torch.mean(torch.pow(Y_hat-Y,2))#计算图在反向传播后立即销毁,如果需要保留计算图, 需要设置retain_graph = True
loss.backward()  #loss.backward(retain_graph = True) #loss.backward() #如果再次执行反向传播将报错

2.7 计算图中的Function

计算图中的 张量我们已经比较熟悉了, 计算图中的另外一种节点是Function, 实际上就是 Pytorch中各种对张量操作的函数。

这些Function和我们Python中的函数有一个较大的区别,那就是它同时包括正向计算逻辑和反向传播的逻辑。

我们可以通过继承torch.autograd.Function来创建这种支持反向传播的Function

class MyReLU(torch.autograd.Function): #自定义的激活函数 #正向传播逻辑,可以用ctx存储一些值,供反向传播使用。@staticmethod #@staticmethod是一个装饰器,表示该方法是一个静态方法 def forward(ctx, input):ctx.save_for_backward(input) #save_for_backward是一个方法,用于保存输入张量,以便在反向传播时使用return input.clamp(min=0) #clamp是一个张量操作函数,min=0表示小于0的值都置为0#反向传播逻辑@staticmethoddef backward(ctx, grad_output):input, = ctx.saved_tensors #saved_tensors是一个属性,用于获取保存的张量grad_input = grad_output.clone() #clone是一个方法,用于复制张量grad_input[input < 0] = 0 #grad_input是一个张量,用于存储反向传播的梯度 return grad_input# d loss /d x = grad_output
# d loss /d y = grad_input
# d loss /d x = (d loss/ dy) * (d y / d x) 
import torch 
w = torch.tensor([[3.0,1.0]],requires_grad=True)
b = torch.tensor([[3.0]],requires_grad=True)
X = torch.tensor([[-1.0,-1.0],[1.0,1.0]])
Y = torch.tensor([[2.0,3.0]])relu = MyReLU.apply # relu现在也可以具有正向传播和反向传播功能
Y_hat = relu(X@w.t() + b)
loss = torch.mean(torch.pow(Y_hat-Y,2))loss.backward()print(w.grad)
print(b.grad)
tensor([[4.5000, 4.5000]])
tensor([[4.5000]])
# Y_hat的梯度函数即是我们自己所定义的 MyReLU.backwardprint(Y_hat.grad_fn)
<torch.autograd.function.MyReLUBackward object at 0x1521b0d50>

2.8 计算图与反向传播

了解了Function的功能,我们可以简单地理解一下反向传播的原理和过程。理解该部分原理需要一些高等数学中求导链式法则的基础知识。

import torch x = torch.tensor(3.0,requires_grad=True)
y1 = x + 1
y2 = 2*x
loss = (y1-y2)**2loss.backward()
x.grad 
#x的梯度是4.0
# 反向传播的梯度是loss对x的偏导数# d loss /dx = (d loss /d y1) * (d y1 /x) + (d loss /d y2) * (d y2 /x) 
#y1 = 4
#y2 = 6
#2*(-2)*1 + 2*(2)*2 = -4 + 8 = 4
tensor(4.)

loss.backward()语句调用后,依次发生以下计算过程。

1,loss自己的grad梯度赋值为1,即对自身的梯度为1。

2,loss根据其自身梯度以及关联的backward方法,计算出其对应的自变量即y1和y2的梯度,将该值赋值到y1.grad和y2.grad。

3,y2和y1根据其自身梯度以及关联的backward方法, 分别计算出其对应的自变量x的梯度,x.grad将其收到的多个梯度值累加。

(注意,1,2,3步骤的求梯度顺序和对多个梯度值的累加规则恰好是求导链式法则的程序表述)

正因为求导链式法则衍生的梯度累加规则,张量的grad梯度不会自动清零,在需要的时候需要手动置零。

2.9 叶子节点和非叶子节点

执行下面代码,我们会发现 loss.grad并不是我们期望的1,而是 None。

类似地 y1.grad 以及 y2.grad也是 None.

这是为什么呢?这是由于它们不是叶子节点张量。

在反向传播过程中,只有 is_leaf=True 的叶子节点,需要求导的张量的导数结果才会被最后保留下来。

那么什么是叶子节点张量呢?叶子节点张量需要满足两个条件。

1,叶子节点张量是由用户直接创建的张量,而非由某个Function通过计算得到的张量。

2,叶子节点张量的 requires_grad属性必须为True.

Pytorch设计这样的规则主要是为了节约内存或者显存空间,因为几乎所有的时候,用户只会关心他自己直接创建的张量的梯度。

所有依赖于叶子节点张量的张量, 其requires_grad 属性必定是True的,但其梯度值只在计算过程中被用到,不会最终存储到grad属性中。

如果需要保留中间计算结果的梯度到grad属性中,可以使用 retain_grad方法。
如果仅仅是为了调试代码查看梯度值,可以利用register_hook打印日志。

import torch x = torch.tensor(3.0,requires_grad=True)
y1 = x + 1
y2 = 2*x
loss = (y1-y2)**2loss.backward()
print("loss.grad:", loss.grad)
print("y1.grad:", y1.grad)
print("y2.grad:", y2.grad)
print(x.grad)
loss.grad: None
y1.grad: None
y2.grad: None
tensor(4.)
print(x.is_leaf)
print(y1.is_leaf)
print(y2.is_leaf)
print(loss.is_leaf)
True
False
False
False

利用retain_grad可以保留非叶子节点的梯度值,利用register_hook可以查看非叶子节点的梯度值。

import torch #正向传播
x = torch.tensor(3.0,requires_grad=True)
y1 = x + 1
y2 = 2*x
loss = (y1-y2)**2#非叶子节点梯度显示控制
y1.register_hook(lambda grad: print('y1 grad: ', grad))
y2.register_hook(lambda grad: print('y2 grad: ', grad))
loss.retain_grad()#反向传播
loss.backward()
print("loss.grad:", loss.grad)
print("x.grad:", x.grad)
y2 grad:  tensor(4.)
y1 grad:  tensor(-4.)
loss.grad: tensor(1.)
x.grad: tensor(4.)

三、计算图在TensorBoard中的可视化

可以利用torch.utils.tensorboard 将计算图导出到TensorBoard进行可视化

from torch import nn
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.w = nn.Parameter(torch.randn(2,1)) #nn.Parameter是一个类,用于定义模型的参数self.b = nn.Parameter(torch.zeros(1,1)) def forward(self, x):y = x @ self.w + self.b #@是矩阵乘法运算符return y 
net = Net() #实例化模型    
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('runs/tensorboard_example') #创建一个SummaryWriter对象,用于记录训练过程中的数据w
writer.add_graph(net,input_to_model=torch.rand(10,2)) #add_graph是一个方法,用于添加模型图
writer.close() #关闭SummaryWriter对象
#tensorboard --logdir=runs/tensorboard_examplefrom tensorboard import notebook
notebook.list() #列出所有的tensorboard实例
notebook.start('--logdir=runs/tensorboard_example') #启动tensorboard实例

在这里插入图片描述

总结

Pytorch的计算图由节点和边组成,节点表示张量或者Function,边表示张量和Function之间的依赖关系。
Pytorch构建动态计算图,通过反向传播来实现自动微分机制

参考链接:

  1. https://www.bilibili.com/video/BV1rR4y197HM?vd_source=41eda4a1e91bb010366913e2b99886b9
  2. https://github.com/lyhue1991/eat_pytorch_in_20_days

相关文章:

pytorch计算图Computation_graph是什么

文章目录 一、AI系统中的计算图&#xff08;宏观&#xff09;二、动态计算图&#xff08;微观&#xff09;2.1 张量计算图2.2 计算图的定义2.3 节点类型2.4 计算图的动态性2.5 计算图的正向传播是立即执行的2.6 计算图在反向传播后立即销毁2.7 计算图中的Function2.8 计算图与反…...

HTML5元素

HTML5的<section>元素和<article>元素 <section>元素定义文档中的一部分&#xff0c;着重于对页面内容进行分块或者分段&#xff0c;通常可以分为引言、内容和联系人信息等几个部分。 <section><h1>WWF</h1><p>WWF 是世界自然基金…...

单reactor实战

前言&#xff1a;reactor作为一种高性能的范式&#xff0c;值得我们学习 本次目标 实现一个基于的reactor 具备echo功能的服务器 核心组件 Reactor本身是靠一个事件驱动的框架,无疑引出一个类似于moduo的"EventLoop "以及boost.asio中的context而言&#xff0c;不断…...

【C#知识点详解】LinkedList<T>储存结构详解

今天来介绍一下LinkedList<T>的内部结构&#xff0c;说不多说直接开始。 内部数据 LinkedList是一个双向链表结构的容器&#xff0c;其内部为非连续的内存空间。LinkedList包含的主要成员示例如下&#xff1a; //起始LinkedListNode节点 internal LinkedListNode<T&g…...

智能穿梭车在快消行业的融合升级:效率革命与数据智能的双重赋能

快消品牌&#xff08;FMCG&#xff09;的核心挑战在于高频周转、海量SKU、短时效性&#xff0c;而智能穿梭车的技术进化&#xff08;如AI调度、5G通信、柔性载具&#xff09;与快消行业的业务需求&#xff08;如全渠道订单履约、动态库存优化&#xff09;深度结合&#xff0c;正…...

(二)链表结构

备注&#xff1a;根据coderwhy数据结构与算法课程进行笔记总结 1.数组缺点&#xff1a; 数组创建通常需要申请一段连续的内存空间&#xff0c;且大小固定&#xff0c;因此当前数组不能满足容量需求时&#xff0c;就需要扩容。在数组开头或中间位置插入数据成本很高&#xff0…...

oracle json笔记

文章目录 json_valuejson_value示例json_value on error如何使用 TODO json_queryjson_query示例 json_tablejson_table 示例 json_existsjson_exists示例json_exists报错 ORA-40458: 在谓词外部使用了 JSON_EXISTS json_objectjson_arrayjson_mergepatchjson_objectaggjson_ar…...

c编译和c++编译有什么区别?

文章目录 c编译和c编译有什么区别多态函数重载虚函数表 vtable 输入输出同步类型检查模板和特化链接 C 标准库 C 能编译 C 的代码吗&#xff1f; c编译和c编译有什么区别 多态 函数重载 C 支持多个同名函数&#xff08;参数不同&#xff09;&#xff0c;这是编译期多态 编译…...

【Mysql】主从复制和读写分离

一、定义 1、什么是读写分离&#xff1f; 在主库master上负责处理事务性写入操作&#xff0c;在从库slave上负责处理查询操作&#xff0c;并通过主从复制将主库上的数据同步给从库。 2、为什么要读写分离&#xff1f; 从集中到分布&#xff0c;最基本的一个需求不是数据存储的…...

泛目录排名——深入理解与优化 SEO:提升网站可见性的关键策略

https://www.zhanqun.xin/ 在数字化时代&#xff0c;互联网上的信息呈爆炸式增长。对于企业和网站运营者而言&#xff0c;如何让自己的网站在海量的网络内容中脱颖而出&#xff0c;吸引目标受众的关注&#xff0c;成为了一项至关重要的挑战。搜索引擎优化&#xff08;SEO&#…...

汇丰eee2

聚合和继承有什么样的优点和区别&#xff0c;什么时候决定用&#xff0c;现实开发中&#xff0c;选择哪一种去使用&#xff1f; 聚合的优点&#xff1a; 灵活性&#xff1a; 聚合是一种弱耦合关系&#xff0c;被聚合对象可以独立存在&#xff0c;可以灵活地替换或修改被聚合对…...

C#网络编程(Socket编程)

文章目录 0、写在前面的话1、Socket 介绍1.1 Socket是什么1.2 Socket在网络中的位置 2、C# 中的Socket参数2.1 超时控制参数2.2 缓冲区参数2.3 UDP专用参数 3、C# 中的Socket API3.1 Socket&#xff08;构造函数&#xff09;3.1.1 SocketType3.1.2 ProtocolType3.1.3 AddressFa…...

使用Python的Schedule库实现定时任务,并传递参数给任务函数

哈喽,大家好,我是木头左! 本文将详细介绍如何使用schedule库来创建定时任务,并展示如何向任务函数传递参数。 安装Schedule库 需要安装schedule库。你可以使用以下命令通过pip进行安装: pip install schedule基本用法 schedule库的基本用法非常简单。你可以通过调用sch…...

Unity Input 2023 Release-Notes

&#x1f308;Input 2023 Release-Notes 版本更新内容2023.2.17Input: Crash on InputDeviceIOCTL when closing Unity editor(UUM-10774)2023.2.16Input: Crash on InputDeviceIOCTL when closing Unity editor(UUM-10774)2023.2.15Input: Crash on InputDeviceIOCTL when clo…...

IP查询能够帮助企业进行数字化转型

企业如今正面临着用户行为碎片化、市场竞争白热化的挑战。那么企业要如何从海量网络数据中精准捕捉用户需求就十分重要了。而IP查询技术也正帮助越来越多的企业在精准营销、风险防控、合规运营等领域开辟新的增长空间。 https://www.ipdatacloud.com/?utm-sourceLMN&utm-…...

Nginx漏洞复现

vulhub起靶场 Nginx 文件名逻辑漏洞&#xff08;CVE-2013-4547&#xff09; 上传1.gif&#xff0c;内容为 <?php phpinfo();?> http://your-ip:8080/uploadfiles/1.gif[0x20][0x00].php访问文件位置&#xff0c;这里0x00要改包 先访问/uploadfiles/1.gif a.php&…...

数据结构|排序算法(二)插入排序 希尔排序

一、插入排序 1.算法思想 插入排序&#xff08;Insertion Sort&#xff09;是一种简单的排序算法&#xff0c;其基本思想是&#xff1a;将待排序的元素插入到已经有序的序列中&#xff0c;从而逐步构建有序序列。 具体过程如下&#xff1a; 把待排序的数组分为已排序和未排…...

OpenBMC:BmcWeb 处理http请求5 检查权限

OpenBMC:BmcWeb 处理http请求4 处理路由对象-CSDN博客 在通过url获取了路由对象后,如果该请求是有session的,那么下一步需要检查权限 1.validatePrivilege调用时传入了一个lambda(1)做为回调 validatePrivilege(req, asyncResp, rule,[req, asyncResp, &rule, params =…...

CentOS 系统磁盘扩容并挂载到根目录(/)的详细步骤

在使用 CentOS 系统时&#xff0c;经常会遇到需要扩展磁盘空间的情况。例如&#xff0c;当虚拟机的磁盘空间不足时&#xff0c;可以通过增加磁盘容量并将其挂载到根目录&#xff08;/&#xff09;来解决。以下是一个完整的操作流程&#xff0c;详细介绍了如何将新增的 10G 磁盘…...

Axure RP 9 for Mac 交互原型设计 安装教程@[TOC](文章目录)

Axure RP 9 for Mac 交互原型设计 安装教程TOC 一、介绍 Axure RP 9是一款功能强大的原型设计和协作工具。它不仅能够帮助用户快速创建出高质量的原型设计&#xff0c;还能促进团队成员之间的有效协作&#xff0c;从而极大地提高数字产品开发的效率和质量。拥有直观易用的界面…...

每日一题(小白)暴力娱乐篇19

样例&#xff1a; 6 1 1 4 5 1 4 输出&#xff1a; 56 66 52 44 54 64 分析题意可以得知&#xff0c;就是接收一串数字&#xff0c;将数字按照下标每次向右移动一位&#xff08;末尾循环到第一位&#xff09;&#xff0c;每次移动玩计算一下下标和数字的乘积且累加。 ①接收…...

LeetCode 第53题:最大子数组和

题目描述&#xff1a; 给你一个整数数组nums&#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。子数组是数组中的一个连续部分。 示例1: 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff…...

顺序表:从数组到高效数据管理的进化之路

一、线性表&#xff1a;数据结构的 “基础骨架” 在数据结构的世界里&#xff0c;线性表是最基础的结构之一。它是由n个具有相同特性的数据元素组成的有限序列&#xff0c;就像一列整齐排列的士兵&#xff0c;每个元素都有唯一的前驱&#xff08;除了第一个&#xff09;和后继…...

TS知识补充第一篇 ✅

目录 1️⃣ any、unknow和never 2️⃣ 函数重载 3️⃣ typeof和keyof&#xff08;配合构建字典类型的Demo&#xff0c;巨好用‼️&#xff09; 4️⃣ TS的条件类型 5️⃣ TS的声明合并 一、any、unknow和never any any类型表示一个值可以是任何类型。通常在不确定变量的类型…...

每日一题(小白)模拟娱乐篇18

今天和大家一起玩个小游戏&#xff0c;给小朋友分糖果&#x1f36c; 由题知就是小朋友每次给左手边的小朋友分一半糖果&#xff0c;一轮下来如果是奇数糖果老师就给他补一个直到所有小朋友拥有相同数量的糖果&#xff0c;问问老师发放了多少糖果。用程序进行模拟的大概思路就是…...

Linux系统学习Day2——在Linux系统中开发OpenCV

一、OpenCV简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的跨平台计算机视觉和机器学习库&#xff0c;广泛应用于图像处理、视频分析、物体检测等领域。它提供了丰富的算法和高效的工具集&#xff0c;支持C、Python等多种语言&#xff0c…...

Redisson 实现分布式锁

在平常的开发工作中&#xff0c;我们经常会用到锁&#xff0c;那么锁有什么用呢&#xff1f;锁主要是控制对共享资源的访问顺序&#xff0c;防止多个线程并发操作导致数据不一致的问题。经常可能会听到乐观锁、悲观锁、分布式锁、行锁、表锁等等&#xff0c;那么我们今天总结下…...

(适合中白)数据结构进阶篇——搜索专题(广度优先搜索算法BFS和深度优先搜索算法DFS)

深度优先搜索DFS&广度优先搜索BFS 深度优先搜索广度优先搜索 深度优先搜索 当碰到岔路口时&#xff0c;总是以深度作为前进的关键词&#xff0c;不碰到死胡同就不回头的这种搜索方式被称为深度优先搜索(Depth First Search) 深度优先搜索是一种枚举所有完整路径以遍历所有情…...

SGLang实战问题全解析:从分布式部署到性能调优的深度指南

引言&#xff1a;当高性能推理遇上复杂生产环境 在大型语言模型(LLM)的生产部署中&#xff0c;SGLang以其革命性的RadixAttention和结构化编程能力&#xff0c;正成为越来越多企业的首选推理引擎。然而&#xff0c;当我们将32B/70B级别的大模型部署到实际生产环境时&#xff0…...

Java大视界:解码航天遥测数据的银河密码——从GB到PB的技术革命

当长征火箭划破苍穹的瞬间&#xff0c;每秒产生的遥测数据足以填满一部4K电影。在这场与星辰对话的征程中&#xff0c;Java大数据生态正扮演着解码宇宙密码的"数字炼金师"。本文将带您穿越三个认知维度&#xff0c;揭示Java技术栈如何重构航天数据分析的底层逻辑。 …...

《C++探幽:STL(string类源码的简易实现(下))》

作者的个人gitee▶️ 作者的算法讲解主页 每日一言&#xff1a;“驿寄梅花&#xff0c;鱼传尺素&#xff0c;砌成此恨无重数。&#x1f338;&#x1f338;” 接《C探幽&#xff1a;STL&#xff08;string类源码的简易实现&#xff08;上&#xff09;&#xff09;》&#x1f534…...

求线性表的倒数第K项 (数组、头插法、尾插法)

给定一系列正整数&#xff0c;请设计一个尽可能高效的算法&#xff0c;查找倒数第K个位置上的数字。 输入格式: 输入首先给出一个正整数K&#xff0c;随后是若干非负整数&#xff0c;最后以一个负整数表示结尾&#xff08;该负数不算在序列内&#xff0c;不要处理&#xff09…...

rustdesk自建服务器怎么填写客户端配置信息

目录 # id、api、中继都怎么填&#xff1f;rustdesk程序启动后服务不自动启动 # id、api、中继都怎么填&#xff1f; rustdesk程序启动后服务不自动启动 完全退出RudtDesk程序&#xff08;右下角托盘区有的话&#xff0c;需要右键点退出&#xff09; 创建windows服务&#xff…...

4月8日日记

今天抖音刷到一个视频 记了一下笔记 想做自媒体&#xff0c;直播&#xff0c;抖音是最大的平台&#xff0c;但是我的号之前因为跟人互喷被封号了 今天想把实名认证转移到新号上&#xff0c;试了一下竟然这次成功了&#xff0c;本以为能开直播了但是 还是因为之前的号有违规记…...

VScode添加python解释器

先安装python扩展 然后点ctrlshiftp搜索python:select&#xff0c;选择解析器&#xff08;或者也可以直接点左下方的&#xff09;...

Elasticsearch | ES索引模板、索引和索引别名的创建与管理

关注&#xff1a;CodingTechWork 引言 在使用 Elasticsearch (ES) 和 Kibana 构建数据存储和分析系统时&#xff0c;索引模板、索引和索引别名的管理是关键步骤。本文将详细介绍如何通过 RESTful API 和 Kibana Dev Tools 创建索引模板、索引以及索引别名&#xff0c;并提供具…...

用 Python 造轮子:打造轻量级 HTTP 调试工具

目录 一、为什么需要自建工具&#xff1f; 二、核心功能设计 三、技术选型 四、分步实现 第一步&#xff1a;搭建基础框架 第二步&#xff1a;实现请求转发逻辑 第三步&#xff1a;响应格式化处理 第四步&#xff1a;历史记录存储 五、进阶优化技巧 六、使用示例 七…...

java设计模式-原型模式

原型模式 1、原型模式(Prototype模式)是指&#xff1a;用原型实例指定创建对象的种类&#xff0c;并通过拷贝这些原型&#xff0c;创建新的对象 2、原型模式是一种创见性设计模式&#xff0c;允许一个对象再创建另一个可定制的对象&#xff0c;无需知道如何创建的细节。 3、工作…...

【Java设计模式】第9章 原型模式讲解

9. 原型模式 9.1 原型模式讲解 定义:通过拷贝原型实例创建新对象,无需调用构造函数。特点: 创建型模式无需了解创建细节适用场景: 类初始化消耗资源多对象创建过程繁琐(如属性赋值复杂)循环体中需创建大量对象优点: 性能优于直接new简化创建流程缺点: 必须实现clone()…...

Python 快速搭建一个小型的小行星轨道预测模型 Demo

目录 ✅ Demo 目标&#xff1a; &#x1f9ea; 模型方案选择 方案 1&#xff1a;开普勒 LSTM 混合预测&#xff08;推荐 &#x1f4a1;&#xff09; 方案 2&#xff1a;全 AI&#xff1a;LSTM 直接拟合轨迹 &#x1f6a7; 环境准备 &#x1f527; 示例代码结构&#xff…...

【AI】Ragflow构建本地知识库

https://github.com/infiniflow/ragflow/blob/main/README_zh.md DeepSeek搭建的本地知识库很呆&#xff1f;不符合自己的预期&#xff1f;看完这个视频你就明白了&#xff01;这样部署吊打其他的本地部署&#xff01;跟着教程来&#xff0c;不怕学不会&#xff01;_哔哩哔哩_…...

【Django】教程-12-柱状图

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...

市政消防栓智能监控管理系统(Axure高保真原型)

在城市的运转体系中&#xff0c;市政消防栓扮演着无可替代的关键角色&#xff0c;作为城市公共安全基础设施的核心&#xff0c;它是火灾扑救时的关键水源保障&#xff0c;其重要性不言而喻。当火灾这头 “猛兽” 突然来袭&#xff0c;市政消防栓就是那道阻止火势蔓延、守护生命…...

机器学习课堂6交叉熵代价函数的逻辑回归模型

代码 # 2-10交叉熵代价函数的逻辑回归模型 import pandas as pd import numpy as np import matplotlib.pyplot as plt# 参数设置 iterations 1000 # 迭代次数 learning_rate 0.1 # 学习率 m_train 250 # 训练样本数量# 读入酒驾检测数据集 df pd.read_csv(alcohol_d…...

华为ar1200修改con口密码

<Huawei> <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]user-interface console 0 进入端口 [Huawei-ui-console0]authentication-mode pass 以pass模式登录 [Huawei-ui-console0]set authentication password cipher …...

Java 集合有序性与重复性总结及记忆技巧

Java 集合有序性与重复性总结及记忆技巧 一、集合分类速查表 集合类型是否有序是否允许重复记忆口诀ArrayList✅ 有序&#xff08;插入顺序&#xff09;✅ 可重复"数组列表&#xff0c;顺序记牢"LinkedList✅ 有序&#xff08;插入顺序&#xff09;✅ 可重复"…...

机器学习--词向量转换

引言 在自然语言处理&#xff08;NLP&#xff09;的广阔领域中&#xff0c;计算机面临的一大挑战是理解人类语言的丰富性和复杂性。文本数据对于机器而言&#xff0c;最初只是一连串难以理解的字符。词向量转换便成为了一座关键的桥梁&#xff0c;它将文本中的单词映射为数值向…...

时序数据异常检测-综述

更新中 异常检测基本概念 广义的Out-of-Distribution(广义的OOD)来描述异常检测的相关问题。OOD包括五个相关的子领域,分别为Anomaly Detection(AD)、Novelty Detection(ND)、Open Set Recogntion(OSR)、Out-of-Distribution(OOD)和Outlier Detection(OD)。这5个…...

2025年Python的主要应用场景

李升伟 编译 Python在2025年仍是最受欢迎和强大的编程语言之一。其简洁易读的语法以及庞大的库生态系统&#xff0c;使其成为各行业开发者的首选。无论是构建复杂的数据管道&#xff0c;还是自动化重复性任务&#xff0c;Python都能提供广泛的应用场景&#xff0c;以实现快速、…...

树的深度遍历和广度遍历

目录 一、深度优先遍历&#xff08;递归&#xff09;二叉树的深度优先遍历&#xff08;递归&#xff09; 二、广度优先遍历二叉树的广度遍历 一、深度优先遍历&#xff08;递归&#xff09; #include<iostream> #include<vector>using namespace std;const int N1…...