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

Pytorch学习笔记(十)Learning PyTorch - Learning PyTorch with Examples

这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 Learning PyTorch with Examples 部分。

  • 官网链接:https://pytorch.org/tutorials/beginner/pytorch_with_examples.html
完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwd=aa2m 提取码: aa2m 

主要由以下四个部分组成:

  • Tensors
  • Autograd
  • nn Module
  • Examples

PyTorch 的核心功能有两个:

  • 可以在 GPU 上运行的n维Tensor;
  • 用于构建和训练神经网络的自动微分;

这里将使用三阶多项式拟合 y = s i n ( x ) y=sin(x) y=sin(x) 作为运行示例。网络有四个参数,并将通过梯度下降进行训练,以通过最小化网络输出和真实输出之间的欧几里得距离来拟合随机数据。


Tensors

  • 官网链接: https://pytorch.org/tutorials/beginner/pytorch_with_examples.html#tensors

Numpy 梯度下降拟合三阶多项式

Numpy 提供了一个 n 维数组对象,以及许多用于操作这些数组的函数。Numpy 是一个通用的科学计算框架,通过pytorch可以轻松地使用 numpy 来拟合三阶多项式到正弦函数,方法是使用 numpy 操作手动实现通过网络的前向和后向传递:

导入依赖包

import numpy as np
import math

定义一个随机的输入 x x x 与输出 y y y

x = np.linspace(-math.pi, math.pi, 2000)
y = np.sin(x)

随机初始化模型的权重

a = np.random.randn()
b = np.random.randn()
c = np.random.randn()
d = np.random.randn()

手动模拟神经网络MSE梯度下降调参

learning_rate = 1e-6for t in range(2000):y_pred = a + (b*x) + (c*x**2) + (d*x**3)   # y=a+bx+cx^2+dx^3loss = np.square(y_pred-y).sum()if t % 100 == 99:print(f"[{t+1}/2000]: loss={loss}")# 计算梯度grad_y_pred = 2.0 * (y_pred - y)grad_a = grad_y_pred.sum()grad_b = (grad_y_pred * x).sum()grad_c = (grad_y_pred * x**2).sum()grad_d = (grad_y_pred * x**3).sum()# 更新权重a -= learning_rate * grad_ab -= learning_rate * grad_bc -= learning_rate * grad_cd -= learning_rate * grad_dprint(f'Result: y = {a} + {b} x + {c} x^2 + {d} x^3')

这里在loss时使用的是MSE:
L o s s = ∑ ( y p r e d − y ) 2 Loss=\sum(y_{pred}-y)^{2} Loss=(ypredy)2
因此损失函数的梯度为:
∂ L ∂ y p r e d = ∂ ( y p r e d − y ) 2 ∂ y p r e d = 2 ( y p r e d − y ) \frac{\partial{L}}{\partial{y_{pred}}}=\frac{\partial{(y_{pred}-y)^{2}}}{\partial{y_pred}}=2(y_{pred}-y) ypredL=ypred(ypredy)2=2(ypredy)
由链式求导法则得所有参数的梯度为
∂ L ∂ a = ∑ 2 ( y p r e d − y ) ∂ L ∂ b = ∑ 2 ( y p r e d − y ) x ∂ L ∂ c = ∑ 2 ( y p r e d − y ) x 2 ∂ L ∂ d = ∑ 2 ( y p r e d − y ) x 3 \begin{align} \frac{\partial{L}}{\partial{a}} &= \sum{2(y_{pred}-y)} \\ \frac{\partial{L}}{\partial{b}} &= \sum{2(y_{pred}-y)x} \\ \frac{\partial{L}}{\partial{c}} &= \sum{2(y_{pred}-y)x^{2}} \\ \frac{\partial{L}}{\partial{d}} &= \sum{2(y_{pred}-y)x^{3}} \end{align} aLbLcLdL=2(ypredy)=2(ypredy)x=2(ypredy)x2=2(ypredy)x3
那么参数更新使用梯度下降:
θ = θ − α ∂ L ∂ θ \theta=\theta-\alpha\frac{\partial{L}}{\partial{\theta}} θ=θαθL


pytorch 梯度下降拟合三阶多项式

Numpy 无法利用 GPU 来加速其数值计算。对于现代深度神经网络而言,GPU 通常可以提供 50 倍或更高的加速。PyTorch 概念Tensor与numpy 数组相同,是一个 n 维数组。PyTorch 提供了许多用于操作这些张量的函数。与 numpy 不同的是,PyTorch Tensor可以利用 GPU 来加速其数值计算。这里使用 Tensor 将三阶多项式拟合为正弦函数。与上面的 numpy 示例类似,需要手动实现通过网络的前向和后向传递。

导入依赖包

import torch
import math

定义一个随机的输入 x 与输出 y

dtype = torch.float
device = torch.device('cuda:0')x = torch.linspace(-math.pi, math.pi, 2000, device=device, dtype=dtype)
y = torch.sin(x)

随机初始化模型的权重

a = torch.randn((), device=device, dtype=dtype)
b = torch.randn((), device=device, dtype=dtype)
c = torch.randn((), device=device, dtype=dtype)
d = torch.randn((), device=device, dtype=dtype)

手动模拟神经网络MSE梯度下降调参

learning_rate = 1e-6
for t in range(2000):y_pred = a + (b*x) + (c*x**2) + (d*x**3)   # y=a+bx+cx^2+dx^3loss = (y_pred-y).pow(2).sum().item()if t % 200 == 99:print(f"[{t+1}/2000]: loss={loss}")# 计算梯度grad_y_pred = 2.0 * (y_pred - y)grad_a = grad_y_pred.sum()grad_b = (grad_y_pred * x).sum()grad_c = (grad_y_pred * x ** 2).sum()grad_d = (grad_y_pred * x ** 3).sum()# 更新权重a -= learning_rate * grad_ab -= learning_rate * grad_bc -= learning_rate * grad_cd -= learning_rate * grad_dprint(f'Result: y = {a.item()} + {b.item()} x + {c.item()} x^2 + {d.item()} x^3')

可以看到代码基本与 Numpy 的一样,但如果你真的运行后会发现这个结果是秒出的,而 Numpy 的结果是一条一条打印的。


Autograd

  • 官网链接: https://pytorch.org/tutorials/beginner/pytorch_with_examples.html#autograd

Tensor & Autograd

在上面的例子中,必须手动实现神经网络的前向和后向传递。pytorch 提供了自动微分机来自动计算神经网络中的反向传播,在PyTorch 的 autograd 包中。使用 autograd 时,网络的前向传递将定义一个计算图,图中的节点是Tensor,边是从输入Tensor产生输出Tensor的函数,通过此图反向传播以轻松计算梯度。每个Tensor代表计算图中的一个节点。如果 x x x 是具有 x.requires_grad=True 的Tensor,则 x.grad 是另一个Tensor,保存了 x 相对于某个标量值的梯度。

这里使用 PyTorch Tensorsautograd 来实现用三阶多项式示例拟合正弦波,这部分内容和上面的非常相似,只不过用pytorch的特性代替了一些原本需要手算的部分。

导入依赖的库:

import torch
import math

查看当前可用的计算加速设备,这里使用了 torch.set_defaule_device() 后面就不用将每个变量手动移动了

dtype = torch.float
device = torch.accelerator.current_accelerator().type if torch.accelerator.is_available() else 'cpu'
print(f"Device {device}")
torch.set_default_device(device)

定义需要被拟合的sin函数

x = torch.linspace(-math.pi, math.pi, 2000, dtype=dtype)
y = torch.sin(x)

定义模型的权重

a = torch.randn((), dtype=dtype, requires_grad=True)
b = torch.randn((), dtype=dtype, requires_grad=True)
c = torch.randn((), dtype=dtype, requires_grad=True)
d = torch.randn((), dtype=dtype, requires_grad=True)

定义训练流程

learning_rate = 1e-6
for t in range(2000):y_pred = a + (b*x) + (c*x**2) + (d*x**3)   # y=a+bx+cx^2+dx^3loss = (y_pred-y).pow(2).sum()            # 此处loss天然是一个Tensor,求loss和if t % 100 == 99:print(f"[{t+1}/2000]: loss={loss}")# 反向传播loss.backward()# 模拟optimizer梯度下降动作with torch.no_grad():    # 在进行梯度下降时要关闭梯度计算,避免出现混乱a -= learning_rate * a.gradb -= learning_rate * b.gradc -= learning_rate * c.gradd -= learning_rate * d.grad# 在完成一次梯度计算后将梯度清空a.grad = Noneb.grad = Nonec.grad = Noned.grad = Noneprint(f'Result: y = {a.item()} + {b.item()} x + {c.item()} x^2 + {d.item()} x^3')

Defining new autograd functions

在底层每个原始自动求导运算符实际上是两个对Tensor进行操作的函数:

  • 前向函数根据输入Tensor计算输出Tensor;
  • 后向函数接收输出Tensor相对于某个标量值的梯度,并计算输入Tensor相对于同一标量值的梯度;

在 PyTorch 中,可以通过定义 torch.autograd.Function 的子类并实现前向和后向函数来定义自动求导运算符,然后通过构造一个实例并像函数一样调用它来使用的新自动求导运算符,传递包含输入数据的Tensor。

下面这个例子以拟合 y = a + b P 3 ( c + d x ) , P 3 = 1 / 2 ( 5 x 3 − 3 x ) y=a+bP_{3}(c+dx), P_{3}=1/2(5x^{3}-3x) y=a+bP3(c+dx),P3=1/2(5x33x) 函数为例。

导入依赖库

import torch
import math

定义拟合函数中 P3 的部分

class LegendrePolynomial3(torch.autograd.Function):@staticmethoddef forward(ctx, input):ctx.save_for_backward(input)return 0.5 * (5*input**3 - 3*input)@staticmethoddef backward(ctx, grad_output):input, = ctx.saved_tensorsreturn grad_output * 1.5 * (5*input**2 - 1)    # 求导后的函数

查看计算加速设备

dtype = torch.float
device = torch.device('cuda:0')

定义sin变量

x = torch.linspace(-math.pi, math.pi, 2000, dtype=dtype)
y = torch.sin(x)

定义权重

a = torch.full((), 0.0, device=device, dtype=dtype, requires_grad=True)
b = torch.full((), -1.0, device=device, dtype=dtype, requires_grad=True)
c = torch.full((), 0.0, device=device, dtype=dtype, requires_grad=True)
d = torch.full((), 0.3, device=device, dtype=dtype, requires_grad=True)

模拟梯度下降

learning_rate = 5e-6
for t in range(2000):P3 = LegendrePolynomial3.applyy_pred = a + b*P3(c+d*x)loss = (y_pred-y).pow(2).sum()if t % 100 == 99:print(f"[{t+1}/2000]: loss={loss.item()}")loss.backward()with torch.no_grad():a -= learning_rate * a.gradb -= learning_rate * b.gradc -= learning_rate * c.gradd -= learning_rate * d.grada.grad = Noneb.grad = Nonec.grad = Noned.grad = Noneprint(f'Result: y = {a.item()} + {b.item()} * P3({c.item()} + {d.item()} x)')

nn.module

  • 官网链接: https://pytorch.org/tutorials/beginner/pytorch_with_examples.html#nn-module

PyTorch: nn

计算图和自动求导是定义复杂运算符和自动求导的非常强大的范例;然而对于大型神经网络来说,原始的自动求导可能有点太低级了。在构建神经网络时,经常考虑将计算安排到Layer中,其中一些Layer具有可学习的参数,这些参数将在学习过程中进行优化。

在 TensorFlow 中,Keras、TensorFlow-Slim 和 TFLearn 等包提供了对原始计算图的更高级别的抽象。在 PyTorch 中,nn 包也用于同样的目的。nn 包定义了一组模块,它们大致相当于神经网络层。模块接收输入Tensor并计算输出Tensor,但也可能保存内部状态,例如包含可学习参数的Tensor,nn 包还定义了一组常用的损失函数。

在这个例子中使用 nn 包来实现多项式模型网络:

导入依赖库

import torch
import math

定义真值

dtype = torch.float
x = torch.linspace(-math.pi, math.pi, 2000, dtype=dtype)
y = torch.sin(x)

定义输入tensor

p = torch.tensor([1,2,3])
xx = x.unsqueeze(-1).pow(p)

定义模型

model = torch.nn.Sequential(torch.nn.Linear(3,1),torch.nn.Flatten(0, 1)
)

定义损失函数

loss_fn = torch.nn.MSELoss(reduction='sum')

执行拟合过程

learning_rate = 1e-6
for t in range(2000):y_pred = model(xx)loss = loss_fn(y_pred, x)if t % 100 == 99:print(f"[{t+1}/2000]: loss={loss.item()}")# 清空模型中参数的梯度model.zero_grad()# 梯度下降反向传播loss.backward()with torch.no_grad():for param in model.parameters():param -= learning_rate * param.grad

模型拟合结果

linear_layer = model[0]
print(f'Result: y = {linear_layer.bias.item()} + {linear_layer.weight[:, 0].item()} x + {linear_layer.weight[:, 1].item()} x^2 + {linear_layer.weight[:, 2].item()} x^3')

PyTorch.optim

这对于简单的优化算法(如随机梯度下降)来说并不是一个巨大的负担,但在实践中,经常需要使用更复杂的优化器(如 AdaGrad、RMSProp、Adam 等)来训练神经网络。PyTorch 中的 optim 包抽象了优化算法的概念,并提供了常用优化算法的实现。

在此示例中,将使用 nn 包来定义模型,使用 optim 包提供的 RMSprop 算法来优化模型。

导入依赖库

import torch
import math

定义真值

x = torch.linspace(-math.pi, math.pi, 2000, dtype=torch.float)
y = torch.sin(x)

定义输入tensor

p = torch.tensor([1,2,3])
xx = x.unsqueeze(-1).pow(p)

定义模型 & 损失函数 & 优化器

learning_rate = 1e-3model = torch.nn.Sequential(torch.nn.Linear(3,1),torch.nn.Flatten(0, 1)
)loss_fn = torch.nn.MSELoss(reduction='sum')optimizer = torch.optim.RMSprop(model.parameters(), lr=learning_rate)

执行拟合过程

for t in range(2000):y_pred = model(xx)loss = loss_fn(y_pred, y)if t % 100 == 99:print(f"[{t+1}/2000]: loss={loss.item()}")# 优化器清空梯度optimizer.zero_grad()# loss反向传播loss.backward()# 优化器执行参数调整optimizer.step()

模型拟合结果

linear_layer = model[0]
print(f'Result: y = {linear_layer.bias.item()} + {linear_layer.weight[:, 0].item()} x + {linear_layer.weight[:, 1].item()} x^2 + {linear_layer.weight[:, 2].item()} x^3')

PyTorch: Custom nn Modules

有时需要指定比现有模块序列更复杂的模型,可以通过子类化 nn.Module 并定义一个前向来定义自己的模块,该前向接收输入Tensor并使用其他模块或Tensor上的其他自动求导操作生成输出Tensor。

在此示例中,将三阶多项式实现为自定义模块子类:

导入依赖库

import torch
import math

定义三阶多项式

class Polynomial3(torch.nn.Module):def __init__(self):super().__init__()self.a = torch.nn.Parameter(torch.randn(()))self.b = torch.nn.Parameter(torch.randn(()))self.c = torch.nn.Parameter(torch.randn(()))self.d = torch.nn.Parameter(torch.randn(()))def forward(self, x):return self.a + (self.b*x) + (self.c*x**2) + (self.d*x**3)  # y= a + bx + cx^2 + dx^3def string(self):return f'y = {self.a.item()} + {self.b.item()} x + {self.c.item()} x^2 + {self.d.item()} x^3'

定义真值

x = torch.linspace(-math.pi, math.pi, 2000, dtype=torch.float)
y = torch.sin(x)

定义模型 & 损失函数 & 优化器

model = Polynomial3()
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=1e-6)

执行拟合

for t in range(2000):y_pred = model(x)loss = criterion(y_pred, y)if t % 100 == 99:print(f"[{t+1}/2000]: loss={loss.item()}")# 优化optimizer.zero_grad()loss.backward()optimizer.step()

查看拟合结果

print(f"Fitness Result: {model.string()}")

PyTorch: Control Flow + Weight Sharing

下面这个例子是动态图和权重共享的一个例子,实现了一个三阶+五阶多项式,在每次前向传递时选择一个 3 到 5 之间的随机数并使用对应的阶数,多次重复使用相同的权重来计算四阶和五阶。

对于这个模型可以使用普通的 Python 流控制来实现循环,通过在定义前向传递时多次重复使用相同的参数来实现权重共享。

导入依赖库

import random
import torch
import math

定义多项式

class DynamicNet(torch.nn.Module):def __init__(self):super().__init__()self.a = torch.nn.Parameter(torch.randn(()))self.b = torch.nn.Parameter(torch.randn(()))self.c = torch.nn.Parameter(torch.randn(()))self.d = torch.nn.Parameter(torch.randn(()))self.e = torch.nn.Parameter(torch.randn(()))def forward(self, x):y = self.a + (self.b*x) + (self.c*x**2) + (self.d*x**3)for exp in range(4, random.randint(4,6)):y = y + (self.e * x ** exp)return ydef string(self):return f'y = {self.a.item()} + {self.b.item()} x + {self.c.item()} x^2 + {self.d.item()} x^3 + {self.e.item()} x^4 ? + {self.e.item()} x^5 ?'

定义真值

x = torch.linspace(-math.pi, math.pi, 2000, dtype=torch.float)
y = torch.sin(x)

定义模型等

model = DynamicNet()
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=1e-8, momentum=0.9)

执行拟合

for t in range(30000):y_pred = model(x)loss = criterion(y_pred, y)if t % 3000 == 2999:print(f"[{t+1}/2000]: loss={loss.item()}")optimizer.zero_grad()loss.backward()optimizer.step()print(f"Fitness Result: {model.string()}")

在这里插入图片描述

相关文章:

Pytorch学习笔记(十)Learning PyTorch - Learning PyTorch with Examples

这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 Learning PyTorch with Examples 部分。 官网链接:https://pytorch.org/tutorials/beginner/pytorch_with_examples.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m…...

如何使用DeepSeek编写测试用例?

一、DeepSeek在测试用例设计中的定位 DeepSeek作为AI工具,并非直接替代测试设计,而是通过以下方式提升效率: 快速生成基础用例框架(等价类、边界值等) 智能补充易遗漏场景(如特殊字符、异常流) 自动化脚本片段生成(Python/pytest/JUnit等) 测试数据构造建议(符合业务…...

sql server如何提高索引命中率

#新星杯14天创作挑战营第9期# 前言 近期发现以前开发的系统运行缓慢,经排查,发现有很大的优化空间。数据库版本使用的是sql server,主要有以下一些问题点:数据表无索引、一些不规范的写法(例如in、大表关联&#xff0…...

FALL靶机

下载靶机,可以看到靶机地址 在kali上扫描靶机的端口和目录文件 访问:http://192.168.247.146/test.php,他提示我们参数缺失 我们爆破一下他的参数 使用kali自带的fuzz FUZZ就是插入参数的位置 -w 指定字典文件 wfuzz -u "http://192.…...

北斗导航 | 改进最小二乘残差法的接收机自主完好性监测算法原理,公式,应用,研究综述,matlab代码

改进最小二乘残差法的接收机自主完好性监测算法研究 摘要 本文针对传统最小二乘残差RAIM算法在复杂环境下检测性能不足的问题,提出了一种基于加权抗差估计的改进算法。通过引入IGGⅢ权函数构建抗差最小二乘模型,结合滑动窗口方差估计和自适应阈值调整机制,显著提升了算法对…...

WPF 浅述ToolTipService.ShowOnDisabled

WPF 浅述ToolTipService.ShowOnDisabled ToolTipService.ShowOnDisabled 属性可以让工具提示在控件禁用状态下仍然显示。这是一个非常方便且简洁的方式。 使用 ToolTipService.ShowOnDisabled,你可以通过设置 ToolTipService.ShowOnDisabled 属性来确保即使在控件禁…...

嵌入式硬件工程师从小白到入门-PCB绘制(二)

PCB绘制从小白到入门:知识点速通与面试指南 一、PCB设计核心流程 需求分析 明确电路功能(如电源、信号处理、通信)。确定关键参数(电压、电流、频率、接口类型)。 原理图设计 元器件选型:匹配封装、电压、…...

05 Python 元组:不可变序列的解析和应用

文章目录 前言元组定义元组的运算索引操作切片操作连接和重复运算循环遍历元组中的元素成员运算内置函数运算 打包和解包操作交换变量的值 前言 在 Python 编程领域,元组(Tuple)是一类极为重要的数据结构。它属于不可变的序列类型&#xff0…...

MATLAB 批量移动 TIF 文件至分类文件夹

文章目录 前言一、步骤二、代码 前言 本代码用于从指定的源文件夹 (sourceFolder) 中筛选所有 .tif 文件,并根据文件名的特定关键词(Daynight 和 FDI)将其分类移动到相应的目标文件夹 (targetDaynightFolder 和 targetFDIFolder)。 一、步骤…...

Milvus×最新版DeepSeek v3:对标Claude,本地数据五分钟写网站

前言 就在昨晚,DeepSeek v3推出了新版本V3-0324,再次一夜爆火。 虽然官方表示“这只是一次小升级”“API接口和使用方式不变”,但经过Zilliz的第一时间实测,我们发现无论是逻辑能力,还是编程能力,相较原本的…...

抽象代数:群论

系列笔记为本学期上抽象代数课整理的,持续更新。 群的相关定义 群的定义 群是一个带有满足结合律、单位元、逆元的二元运算的集合,记作 ( G , ⋅ ) \left({G, \cdot}\right) (G,⋅)。若群运算满足结合律,则该集合构成半群。如果该半群中含…...

基于 mxgraph 实现流程图

mxgraph 可以实现复杂的流程图绘制。mxGraph里的Graph指的是图论(Graph Theory)里的图而不是柱状图、饼图和甘特图等图(chart),因此想找这些图的读者可以结束阅读了。 作为图论的图,它包含点和边,如下图所示。 交通图 横道图 架构图 mxGrap…...

Stereolabs ZED Box Mini:机器人与自动化领域的人工智能视觉新选择

在人工智能视觉技术快速发展的今天,其应用场景正在持续拓宽,从智能安防到工业自动化,从机器人技术到智能交通,各领域都在积极探索如何利用这一先进技术。而 Stereolabs 推出的ZED Box Mini,正是一款专为满足这些多样化…...

音视频 二 看书的笔记 MediaPlayer

此类是用于播放声音和视频的主要 API 对方不想多说向你丢了一个链接 MediaPlayer Idle 空闲状态Initialized 初始化状态 调用 setDataSource() 时会进入此状态 setDataSource必须在Idle 状态下调用,否则就抛出异常了了了了了。Prepared 准备状态 回调监听setOnPrep…...

可以把后端的api理解为一个目录地址,但并不准确

将后端的 API 理解为一个“目录地址”是可以的,但并不完全准确。让我们更详细地解释一下。 目录 1、生动形象了解api 2、后端 API 的作用 3、可以将 API 理解为“目录地址”的原因 (1)URL 路径 (2)层次结构 4、…...

vscode连接服务器失败问题解决

文章目录 问题描述原因分析解决方法彻底删除VS Code重新安装较老的版本 问题描述 vscode链接服务器时提示了下面问题: 原因分析 这是说明VScode版本太高了。 https://code.visualstudio.com/docs/remote/faq#_can-i-run-vs-code-server-on-older-linux-distribu…...

Qt 高效读写JSON文件,玩转QJsonDocument与QJsonObject

一、前言 JSON作为轻量级的数据交换格式,已成为开发者必备技能。Qt框架为JSON处理提供了完整的解决方案,通过QJsonDocument、QJsonObject和QJsonArray三大核心类,轻松实现数据的序列化与反序列化。 JSON vs INI 特性JSONINI数据结构支持嵌…...

开源视频剪辑工具,无损编辑更高效

LosslessCut 是一款基于 FFmpeg 开发的跨平台开源视频剪辑工具,致力于无损处理音视频文件。它无需重新编码即可完成剪切、合并、轨道编辑等操作,极大地保留了原始文件的质量,特别适合处理大体积视频,如无人机拍摄素材或长时录制内…...

Git 之配置ssh

1、打开 Git Bash 终端 2、设置用户名 git config --global user.name tom3、生成公钥 ssh-keygen -t rsa4、查看公钥 cat ~/.ssh/id_rsa.pub5、将查看到的公钥添加到不同Git平台 6、验证ssh远程连接git仓库 ssh -T gitgitee.com ssh -T gitcodeup.aliyun.com...

(UI自动化测试web端)第二篇:元素定位的方法_css定位之ID选择器

看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写? 文章介绍了第一种写法id选择器,其实XPath元素定位要比CSS好用,原因是CSS无法使用下标(工作当中也是常用的xpath),但CSS定位速度比XPat…...

Mysql---锁篇

1:MySQL 有哪些锁? 全局锁 flush tables with read lock 整个数据库就处于只读状态了 unlock tables 释放全局锁 全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数…...

Django 项目打包exe本地运行

Django 项目打包exe本地运行 记一次离谱的需求 其实本来觉得Django项目架构比较清晰,代码逻辑也简单,没打算记笔记,结果遇到离谱需求折腾了很久 开发了一个Django项目,到交付的时候了,客户说自己没有服务器… 没服务器还要登录功能😓 没办法,甲方最大,整吧 第一…...

20250330 Pyflink with Paimon

1. 数据湖 2. 本地安装Pyflink和Paimon 必须安装Python 3.11 Pip install python -m pip install apache-flink1.20.1 需要手动加入这两个jar 测试代码: import argparse import logging import sys import timefrom pyflink.common import Row from pyflink.tab…...

RTMP推流服务器nginx在linux上的编译部署

RTMP(Real-Time Messaging Protocol)推流确实需要服务器支持‌。RTMP推流服务器的主要功能是接收来自推流客户端的数据流,对其进行处理和转发。服务器会根据RTMP协议与客户端建立连接,处理推流数据(如转码、录制等&…...

Matlab教程001:软件介绍和界面使用

1.1 软件介绍 1.1.1 Matlab的介绍 MATLAB(MATrix LABoratory)是一款由 MathWorks 公司开发的高级编程语言和交互式环境,广泛用于 科学计算、数据分析、机器学习、工程建模、仿真和信号处理 等领域。 1.1.2 主要应用领域 数据分析与可视化…...

【SQL Server数据库备份详细教程】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...

Java设计模式之解释器模式

概念 解释器模式是一种行为型设计模式,用于定义一种语言的语法规则,并提供解释器来解释该语言中的表达式。 作用 其核心作用是将复杂的语法分解为简单的语法单元,通过递归组合的方式构建抽象语法树(AST)&#xff0c…...

el-date-picker时间范围 编辑回显后不能修改问题

el-date-picker daterange时间范围 编辑回显后不能修改 <el-form-item:label"LABELS.gplanRecordDateLabel"prop"gplanRecordDate"><el-date-pickerstyle"width: 300px"v-model"formData.gplanRecordDate"type"daterang…...

vue复习1~45

1.关于vue 要理解记忆规则&#xff0c;可以到官网上去找 vue的两种使用方式 vue核心包开发 场景&#xff1a;局部模块改造vue核心包 & vue插件 工程化开发 场景&#xff1a;整站开发 2.创建vue实例 构建用户页面->创建vue实例初始化渲染 学习阶段用开发版本 3.插值…...

Servlet开发与生命周期详解-2

一、在集成开发环境当中开发Servlet程序 1.集成开发工具很多&#xff0c;其中目前使用比较多的是&#xff1a; IntelliJ IDEA&#xff08;这个居多&#xff0c;IDEA在提示功能方面要强于Eclipse&#xff0c;也就是说IDEA使用起来比Eclipse更加智能&#xff0c;更好用。JetBrai…...

vue2项目eslint提示<template v-for> key should be placed on the <template> tag

在template标签上使用v-for时&#xff0c;vue2会提示key不可放在template标签上&#xff0c;必须放在子元素上。vue3会提示key必须放在template标签上。这时候可能我们怎么写都会触发eslint校验提醒。不影响使用&#xff0c;但看着难受。 我们可以在根目录上新建jsconfig.json…...

老是忘记package.json,备忘一下 webpack 环境下 Vue Cli 和 Vite 命令行工具对比

Vue 2.X webpack 环境下 Vue Cli 的命令 "scripts": {"dev": "vue-cli-service serve","prod": "vue-cli-service serve --mode production","build:dev": "vue-cli-service build --mode development"…...

关于跨域问题(本地前端访问服务器端接口跨域出错)

问题来源&#xff1a; 当服务器封装了接口但是本地电脑端前端访问出现跨域问题。 解决方案&#xff1b; 1、使用ipconfig 查看本地电脑的ip地址 ipconfig 2、在后端接口处配置如下代码 allow_origins["http://本地ip地址:3001", # 局域网内其他设备访问的本地…...

Jackson相关问题

1、json转dto的时候&#xff0c;dto不能定义isActive这种带有is的前缀&#xff0c;如果使用Lombok的Getter/Setter的话&#xff0c;json {"isActive": true}&#xff0c;这样&#xff0c;将无法正确赋值。此时的dto再次转为json之后&#xff0c;得到的是active:false…...

【C++】互斥锁(Mutex)和原子操作(Atomics)

详细探讨 C 中的并发、多线程、互斥锁&#xff08;Mutex&#xff09;和原子操作&#xff08;Atomics&#xff09;的概念及其区别&#xff0c;并附带代码示例。 1. C 并发与多线程 (Concurrency vs. Multithreading) 并发 (Concurrency)&#xff1a;指系统能够处理多个任务的能…...

Linux--命令行操作

一、Linux的作用 1.简单的文件操作 2.编程 3.支持系统和网络 二、多账号管理 1、我们需要在root账号下进行&#xff0c;可以用whoami来查询账号身份 2、adduser 你要创建的账号名 就可以创建一个账号 3、ls /home可以查看账号是否创立 4、使用passwd 创建账号名字的来设…...

具身系列——Diffusion Policy算法实现CartPole游戏

代码原理分析 1. 核心思想 该代码实现了一个基于扩散模型&#xff08;Diffusion Model&#xff09;的强化学习策略网络。扩散模型通过逐步去噪过程生成动作&#xff0c;核心思想是&#xff1a; • 前向过程&#xff1a;通过T步逐渐将专家动作添加高斯噪声&#xff0c;最终变成…...

4.用 Excel 录入数据

一 用 Excel 录入数据的两种方式 用鼠标键盘录入数据和从网上爬取数据。 二 用鼠标键盘录入数据 1.录入数据的规范 横着录入数据&#xff08;横着一条条录入数据&#xff09;。 2.使用快捷键进行数据录入 tab 键和 enter 键。 tab 键&#xff1a;向右移动一个单元格。 tab 键…...

nginx配置跳转设置Host有误导致报404问题

我们有个项目&#xff0c;前端调用了第三方接口。为了避免跨域&#xff0c;所以使用nginx进行转发。一直正常工作&#xff0c;相安无事。近日第三方调整了安全策略&#xff0c;http转换成https&#xff0c;原本使用ip&#xff0c;现在也改成使用域名&#xff0c;所以nginx这里我…...

接口/UI自动化面试题

一、UI自动化 1.1、接口和UI自动化有多少用例&#xff1f; 回答策略&#xff1a;根据接口设定用例&#xff0c;100个接口&#xff0c;自动化case在1500-2000左右。结合自身的项目&#xff0c;回答覆盖的主功能流程。 示例&#xff1a; 接口自动化的测试case一般需要根据接口数…...

Java 中调用语言模型(如 OpenAI、阿里云通义千问、Hugging Face 等)API 的详细步骤和示例代码,涵盖常见场景及注意事项

以下是 Java 中调用语言模型&#xff08;如 OpenAI、阿里云通义千问、Hugging Face 等&#xff09;API 的详细步骤和示例代码&#xff0c;涵盖常见场景及注意事项&#xff1a; 1. 常见语言模型 API 选择 (1) OpenAI API 特点&#xff1a;支持 GPT-3、GPT-3.5、GPT-4 等模型&a…...

搜广推校招面经六十

soul推荐算法 一、word2vec原理 参考一篇文章入门Word2Vec 二、word2vec正负采样怎么做的、word2vec采用的loss和原理 见【搜广推校招面经四、搜广推校招面经五十二、搜广推校招面经五十七】 不太理解为啥问这么多word2vec&#xff0c;索性直接整理一遍。 三、多路召回融合…...

红宝书第十二讲:详解JavaScript中的工厂模式与原型模式等各种设计模式

红宝书第十二讲&#xff1a;详解JavaScript中的工厂模式与原型模式等各种设计模式 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 工厂模式和原型模式解析 一、工厂模式&#xff1a;像订外卖一样创建对象 工厂模…...

Flutter完整开发实战详解(一、Dart语言和Flutter基础)

前言 在如今的 Flutter 大潮下&#xff0c;本系列是让你看完会安心的文章。本系列将完整讲述&#xff1a;如何快速从0开发一个完整的 Flutter APP&#xff0c;配套高完成度 Flutter 开源项目 GSYGithubAppFlutter。同时也会提供一些 Flutter 的开发细节技巧&#xff0c;并针对…...

Kafka 偏移量

在 Apache Kafka 中&#xff0c;偏移量&#xff08;Offset&#xff09;是一个非常重要的概念。它不仅用于标识消息的位置&#xff0c;还在多种场景中发挥关键作用。本文将详细介绍 Kafka 偏移量的核心概念及其使用场景。 一、偏移量的核心概念 1. 定义 偏移量是一个非负整数…...

手撕LRU缓存Java版(带输入输出)

由于面试手撕lru没撕出来&#xff0c;导致心态炸裂&#xff0c;今天特地练习了lru输入输出 手撕版&#xff0c;在每个函数里手动加上输出 public class LC146 {static class LRUCache{class Node{int key, value;Node prev, next;Node(int key, int value){this.key key;thi…...

Android 12系统源码_系统启动(二)Zygote进程

前言 Zygote&#xff08;意为“受精卵”&#xff09;是 Android 系统中的一个核心进程&#xff0c;负责 孵化&#xff08;fork&#xff09;应用进程&#xff0c;以优化应用启动速度和内存占用。它是 Android 系统启动后第一个由 init 进程启动的 Java 进程&#xff0c;后续所有…...

python之并发编程

并发编程介绍 串行、并行与并发的区别 进程、线程、协程的区别 1. 进程 (Process) 定义&#xff1a;进程是操作系统为运行中的程序分配的基本单位。每个进程都有独立的地址空间和资源&#xff08;如内存、文件句柄等&#xff09;。特点&#xff1a; 进程是资源分配的基本单位…...

极速全场景 MPP数据库starrocks介绍

目录 一、引子 二、起源 &#xff08;一&#xff09;前身 &#xff08;二&#xff09;定位 三、特点 &#xff08;一&#xff09;高性能架构 &#xff08;二&#xff09;实时分析 &#xff08;三&#xff09;高并发与扩展性 &#xff08;四&#xff09;兼容性与生态 …...

MySQL 表连接(内连接与外连接)

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 1、表连接的核心概念 1.1 为什么需要表连接&#xff1f; 2、内连接&a…...