[自然语言处理]pytorch概述--什么是张量(Tensor)和基本操作
pytorch概述
PyTorch 是⼀个开源的深度学习框架,由 Facebook 的⼈⼯智能研究团队开发和维护,于2017年在GitHub上开源,在学术界和⼯业界都得到了⼴泛应⽤
pytorch能做什么
- GPU加速
- 自动求导
- 常用网络层
pytorch基础
量的概念
- 标量:数字1,2,3
- 向量:一维表格[1,2,3]
- 矩阵:二维表格[(1,2),(3,4)]
通过向量、矩阵描述的物体最多是H*W维,而生活中很多东西有更高维度,就用张量表示
前面三种量也可以当成张量的一种
张量(Tensor)的基本概念
张量(Tensor)是pytorch中的基本单位,也是深度学习框架构成的重要组成。
我们可以先把张量看做是⼀个容器,⾥⾯承载了需要运算的数据。
tensor 即“张量”。实际上跟numpy数组、向量、矩阵的格式基本一样。但是是专门针对GPU来设计的,可以运行在GPU上来加快计算效率
在PyTorch中,张量Tensor是最基础的运算单位,与NumPy中的NDArray类似,张量表示的是一个多维矩阵。不同的是,PyTorch中的Tensor可以运行在GPU上,而NumPy的NDArray只能运行在CPU上。由于Tensor能在GPU上运行,因此大大加快了运算速度。
一句话总结:一个可以运行在gpu上的多维数据而已
样本和模型 --> Y=WX+B
X:
表示样本
W、B:
表示变量
Y:
表示标签
张量的类型
Data type | dtype | Legacy Constructors(type) |
---|---|---|
32-bit floating point | torch.float32 or torch.float | torch.*.FloatTensor |
64-bit floating point | torch.float64 or torch.double | torch.*.DoubleTensor |
64-bit complex | torch.complex64 or torch.cfloat | |
128-bit complex | torch.complex128 or torch.cdouble | |
16-bit floating point | torch.float16 or torch.half | torch.*.HalfTensor |
16-bit floating point | torch.bfloat16 | torch.*.BFloat16Tensor |
8-bit integer (无符号) | torch.uint8 | torch.*.ByteTensor |
8-bit integer (有符号) | torch.int8 | torch.*.CharTensor |
16-bit integer (有符号) | torch.int16 or torch.short | torch.*.ShortTensor |
32-bit integer (有符号) | torch.int32 or torch.int | torch.*.IntTensor |
64-bit integer (有符号) | torch.int64 or torch.long | torch.*.LongTensor |
Boolean(布尔型) | torch.bool | torch.*.BoolTensor |
张量的创建
函数 | 功能 |
---|---|
Tensor(*size) | 基础构造函数 |
Tensor(data) | 类似np.array |
ones(*size) | 全1 Tensor |
zeros(*size) | 全0 Tensor |
eye(*size) | 对角线为1,其他为0 |
arange(s,e,step) | 从s到e,步长为step的等差数列(不包含e这个值) |
linspace(s,e,steps) | 从s到e,均匀切分成steps份,steps是值的个数 |
rand/randn(*size) | 均匀/标准分布 |
normal(mean,std)/uniform_(from,to) | 正态分布/均匀分布 |
randperm(m) | 随机排列 |
张量初始化方法
1.直接从数据,张量可以直接从数据中创建。数据类型是⾃动推断的
data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)
x_data
tensor([[1, 2],[3, 4]])
x_data.dtype
torch.int64
2.从numpy数组中创建张量(反之亦然)
import numpy as np
np_array = np.array(data)
x_np = torch.from_numpy(np_array)
3.从另一个张量创建张量[除非明确覆盖,否则新张量保留参数张量的属性]
x_ones = torch.ones_like(x_data) # 保留x_data的属性
print(f"Ones Tensor: \n {x_ones} \n")
#由于x_data的数据类型是int64,rand_like函数会生成一个随机张量,数据类型与x_data相同
#而torch.rand()方法是创建一个服从均匀分布的随机张量,值在 [0, 1),数据类型是float32,所以需要强制转换
x_rand = torch.rand_like(x_data, dtype=torch.float) # 重写x_data的数据类型
print(f"Random Tensor: \n {x_rand} \n")
Ones Tensor: tensor([[1, 1],[1, 1]]) Random Tensor: tensor([[0.3156, 0.5076],[0.8555, 0.4440]])
4.使用随机值或常量值
shape 是张量维度的元组。在下⾯的函数中,它决定了输出张量的维度
shape = (2,3,) # 一个标量
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)
print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")
Random Tensor: tensor([[0.5733, 0.8237, 0.1398],[0.9530, 0.9231, 0.2764]]) Ones Tensor: tensor([[1., 1., 1.],[1., 1., 1.]]) Zeros Tensor: tensor([[0., 0., 0.],[0., 0., 0.]])
5.其他一些创建方法
基于现有tensor构建,但使⽤新值填充
m = torch.ones(5,3, dtype=torch.double)
n = torch.rand_like(m, dtype=torch.float)
# 获取tensor的⼤⼩
print(m.size()) # torch.Size([5,3])
# 均匀分布
torch.rand(5,3)
# 标准正态分布
torch.randn(5,3)
# 离散正态分布
torch.normal(mean=.0,std=1.0,size=([5,3]))
# 线性间隔向量(返回⼀个1维张量,包含在区间start和end上均匀间隔的steps个点) 等差数列
torch.linspace(start=1,end=10,steps=20)
torch.Size([5, 3])
tensor([ 1.0000, 1.4737, 1.9474, 2.4211, 2.8947, 3.3684, 3.8421, 4.3158,4.7895, 5.2632, 5.7368, 6.2105, 6.6842, 7.1579, 7.6316, 8.1053,8.5789, 9.0526, 9.5263, 10.0000])
张量的属性
每个Tensor有torch.dtype
、torch.device
、torch.layout
三种属性
torch.device
标识了torch.Tensor
对象在创建之后所存储在的设备名称(cpu还是GPU)
torch.layout
表示torch.Tensor
内存布局的对象
张量的属性描述了张量的形状、数据类型和存储它们的设备。
以对象的⻆度来判断,张量可以看做是具有特征和⽅法的对象
tensor = torch.rand(3,4)
print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")
Shape of tensor: torch.Size([3, 4])
Datatype of tensor: torch.float32
Device tensor is stored on: cpu
张量运算
官网总结的100多种张量运算包括算术、线性代数、矩阵操作(转置、索引、切⽚)、采样等等
这些操作中的每⼀个都可以在 GPU 上运⾏(速度通常⽐在 CPU 上更快)
默认情况下,张量是在 CPU 上创建的。
我们可以使⽤使⽤ .to() ⽅法明确地将张量移动到 GPU (GPU可⽤的情况下)。
请注意!跨设备复制内容量较⼤的张量,在时间和内存⽅⾯可能成本很⾼!
# 设置张量在GPU上运算
# We move our tensor to the GPU if available
if torch.cuda.is_available():tensor = tensor.to('cuda')
张量的索引和切片
tensor = torch.ones(4, 4) # 创建一个4x4的张量
print('First row: ', tensor[0]) # 打印第一行
print('First column: ', tensor[:, 0]) # 打印第一列
print('Last column:', tensor[..., -1]) # 打印最后一列
tensor[:,1] = 0 # 第二列赋值为0
print(tensor)
First row: tensor([1., 1., 1., 1.])
First column: tensor([1., 1., 1., 1.])
Last column: tensor([1., 1., 1., 1.])
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])
张量的拼接
可以使⽤ torch.cat
⽤来连接指定维度的⼀系列张量。另⼀个和 torch.cat
功能类似的函数是torch.stack
方法 | 含义 | 格式 |
---|---|---|
torch.cat | 沿现有维度连接给定的序列 | torch.cat(tensor, dim = 0 , *, out = None ) |
torch.stack | 沿新维度连接一系列张量 | torch.stack(张量, dim = 0, *, out = None) |
print(tensor) # 打印原始张量
t1 = torch.cat([tensor, tensor, tensor], dim=1) # 按列拼接
# dim 参数决定了拼接操作沿着哪个维度进行。具体来说:
# • dim=-1 表示沿着最后一个维度拼接
# • dim=0 表示沿着第一个维度(行的方向)拼接。
# • dim=1 表示沿着第二个维度(列的方向)拼接。
# • dim=2 表示沿着第三个维度(深度方向,通常是针对三维张量)拼接,以此类推。
print(t1)
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])
tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])
算数运算
加法运算
# 加法运算
t1 = torch.tensor([[1,2],[3,4]])
print(t1)
t2 = torch.tensor([[5,6],[7,6]])
print(t2)
t3 = t1 + t2
print(t3)
t4 = torch.add(t1, t2)
print(t4)
print(t1.add(t2))
print(t1)
#t1.add_(t2) # 会改变t1的值
tensor([[1, 2],[3, 4]])
tensor([[5, 6],[7, 6]])
tensor([[ 6, 8],[10, 10]])
tensor([[ 6, 8],[10, 10]])
tensor([[ 6, 8],[10, 10]])
tensor([[1, 2],[3, 4]])
减法运算
#减法运算
print(t1 - t2)
print(torch.sub(t1, t2))
print(t1.sub(t2))
print(t1)
tensor([[-4, -4],[-4, -2]])
tensor([[-4, -4],[-4, -2]])
tensor([[-4, -4],[-4, -2]])
tensor([[1, 2],[3, 4]])
乘法运算
计算两个张量之间矩阵乘法
的⼏种⽅式。 y1, y2, y3 最后的值是⼀样的
二维矩阵乘法运算包括torch.mm()
,torch.matmul()
(高维度仅支持),@
对于高维度的Tensor(dim>2),定义其矩阵乘法仅在最后的两个维度上,要求前面的维度必须保持一致,就像矩阵的索引一样并且运算操作只有
torch.matul()
print(tensor) # 打印原始张量
y1 = tensor @ tensor.T
print(y1) # 等价于 tensor.matmul(tensor.T)
y2 = tensor.matmul(tensor.T)
print(y2) # 等价于 tensor @ tensor.T
y3 = torch.rand_like(tensor) # 与tensor形状相同的随机张量(初始化y3)
torch.matmul(tensor, tensor.T, out=y3) # 输出到y3
print(y3)
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])
tensor([[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.]])
tensor([[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.]])
tensor([[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.]])
#高维度矩阵运算
t5 = torch.ones(1,2,3,4)
print(t5)
t6 = torch.ones(1,2,4,3)
print(t6)
print(t5.matmul(t6)) # torch.Size([1, 2, 3, 1, 2, 3])
print(torch.matmul(t5, t6)) # torch.Size([1, 2, 3, 1, 2, 3])
tensor([[[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]],[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]]]])
tensor([[[[1., 1., 1.],[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]],[[1., 1., 1.],[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]]]])
tensor([[[[4., 4., 4.],[4., 4., 4.],[4., 4., 4.]],[[4., 4., 4.],[4., 4., 4.],[4., 4., 4.]]]])
tensor([[[[4., 4., 4.],[4., 4., 4.],[4., 4., 4.]],[[4., 4., 4.],[4., 4., 4.],[4., 4., 4.]]]])
计算张量逐元素相乘的⼏种⽅法。 z1, z2, z3 最后的值是⼀样的
哈达码积(element wise,对应元素相乘
)
print(tensor) # 打印原始张量
z1 = tensor * tensor # 逐元素相乘
print(z1) # 等价于 tensor.mul(tensor)
z2 = tensor.mul(tensor) # 逐元素相乘
print(z2) # 等价于 tensor * tensor
z3 = torch.rand_like(tensor) # 与tensor形状相同的随机张量(初始化z3)
torch.mul(tensor, tensor, out=z3) # 输出到z3
print(z3)
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])
除法运算
#除法运算
print(t1 / t2)
print(torch.div(t1, t2))
print(t1.div(t2))
print(t1)
tensor([[0.2000, 0.3333],[0.4286, 0.6667]])
tensor([[0.2000, 0.3333],[0.4286, 0.6667]])
tensor([[0.2000, 0.3333],[0.4286, 0.6667]])
tensor([[1, 2],[3, 4]])
幂运算
使用torch.pow(tensor,2)
;**
;两种方法
e指函数:torch.exp(tensor)
print(t1)
print(torch.pow(t1, 2)) # 每个元素平方
print(t1.pow(2)) # 每个元素平方
print(t1**2) # 每个元素平方
#print(t1.pow_(2)) # 每个元素平方
tensor([[1, 2],[3, 4]])
tensor([[ 1, 4],[ 9, 16]])
tensor([[ 1, 4],[ 9, 16]])
tensor([[ 1, 4],[ 9, 16]])
开方运算
tensor.sqrt()
tensor.sqrt_()
对数运算
torch.log2(tensor)
torch.log10(tensor)
torch.log(tensor)
torch.log_(tensor)
单元素张量
如果⼀个单元素张量,例如将张量的值聚合计算,可以使⽤ item()
⽅法将其转换为Python 数值
print(tensor) # 打印原始张量
agg = tensor.sum() # 求和
print(agg)
agg_item = agg.item() # 将张量的值转换为Python数值
print(agg_item, type(agg_item)) # 打印agg_item的值和类型
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])
tensor(12.)
12.0 <class 'float'>
In-place操作
把计算结果存储到当前操作数中的操作就称为就地操作。含义和pandas中inPlace参数的含义⼀样。pytorch中,这些操作是由带有下划线 _ 后缀的函数表⽰。
例如:x.copy_(y)
, x.t_()
, 将改变 x
⾃⾝的值
In-place操作虽然节省了⼀部分内存,但在计算导数时可能会出现问题,因为它会⽴即丢失历史记录。因此,不⿎励使⽤它们。
x = torch.tensor([(1, 2, 3), (4, 5, 6), (7, 8, 9)])
print(x)
x.add_(2) # 逐元素加2
print(x) # 打印x的值
# 注意:任何以`_`结尾的操作都会用结果替换原始张量。例如:x.copy_(y), x.t_() , 将更改 `x`.
tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
tensor([[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
与numpy之间的转换
CPU 和 NumPy 数组上的张量共享底层内存位置,所以改变⼀个另⼀个也会变
张量到numpy数组
t1 = torch.ones(6) # 创建一个张量
print(f"t1:{t1}") #这里的f是格式化张量的内容到字符串中
n1 = t1.numpy() # 张量转numpy数组
print(f"n1:{n1}") # 打印numpy数组
t1:tensor([1., 1., 1., 1., 1., 1.])
n1:[1. 1. 1. 1. 1. 1.]
t1.add_(1) # 逐元素加1
print(f"t1:{t1}") # 打印张量
print(f"n1:{n1}") # 打印numpy数组
t1:tensor([2., 2., 2., 2., 2., 2.])
n1:[2. 2. 2. 2. 2. 2.]
Numpy数组到张量
n2 = np.ones(5) # 创建一个numpy数组
print(f"n2:{n2}") # 打印numpy数组
t2 = torch.from_numpy(n2) # numpy数组转张量
print(f"t2:{t2}") # 打印张量
#Numpy数组和PyTorch张量将共享它们的底层内存位置,因此对一个进行更改将导致另一个也发生更改。
np.add(n2,1,out=n2) # 逐元素加1
print(f"t2:{t2}") # 打印张量
print(f"n2:{n2}") # 打印numpy数组
n2:[1. 1. 1. 1. 1.]
t2:tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
t2:tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
n2:[2. 2. 2. 2. 2.]
计算图
在进⼀步学习pytorch之前,先要了解⼀个概念 —— 计算图( Computation graph)
所有的深度学习框架都依赖于计算图来完成梯度下降、优化梯度值等计算。
⽽计算图的创建和应⽤,通常包含如下两个部分:
- 用户构前向传播图
- 框架处理后向传播(梯度更新)
模型从简单到复杂,pytorch和tensorflow都使⽤计算图来完成⼯作。
但是,这两个框架所使⽤的计算图也却有所不同:
tensorflow1.x 使⽤的是静态计算图
,tensorflow2.x和pytorch使⽤的是动态计算图
静态计算图
先搭建计算图,后运行;允许编译器进行优化
通常包括以下两个阶段。
- 定义⼀个架构(可以使⽤⼀些基本的流控制⽅法,⽐如循环和条件指令)
- 运⾏⼀组数据来训练模型,进⾏推理
- 优点:允许
对图进⾏强⼤的离线优化/调度
,所以速度相对较快
。 - 缺点:难以调试,对代码中处理结构化或者可变⼤⼩的数据处理⽐较复杂
动态计算图
编好程序即可执行
在执⾏正向计算时,隐式地定义图(动态构建)。
- 优点:灵活,侵⼊性⼩,允许动态构建和评估
- 缺点:难以优化
两种计算图⽐较起来,可以看出:动态图是对调试友好的(对程序员友好)。它允许逐⾏执⾏代码,并可以访问所有张量。这样更便于发现和找到我们计算或逻辑中的问题
pytorch计算图可视化
通过torchviz可以实现
import torch
from torchviz import make_dot# 定义矩阵 A,向量 b 和常数 c
A = torch.randn(10, 10,requires_grad=True) #requires_grad=True表示需要计算梯度,对A求导
b = torch.randn(10,requires_grad=True)
c = torch.randn(1,requires_grad=True)
x = torch.randn(10, requires_grad=True)
# 计算 x^T * A + b * x + c
result = torch.matmul(A, x.T) + torch.matmul(b, x) + c
# ⽣成计算图节点
dot = make_dot(result, params={'A': A, 'b': b, 'c': c, 'x': x})
# 绘制计算图
dot.render('expression', format='png', cleanup=True, view=False)
相关文章:
[自然语言处理]pytorch概述--什么是张量(Tensor)和基本操作
pytorch概述 PyTorch 是⼀个开源的深度学习框架,由 Facebook 的⼈⼯智能研究团队开发和维护,于2017年在GitHub上开源,在学术界和⼯业界都得到了⼴泛应⽤ pytorch能做什么 GPU加速自动求导常用网络层 pytorch基础 量的概念 标量…...
18.5 ChatGLM2-6B 开源协议深度解读:自由与约束的平衡之道
ChatGLM2-6B 开源协议深度解读:自由与约束的平衡之道 关键词:ChatGLM2 开源协议, 模型授权合规, 商业使用限制, 技术伦理条款, 国产大模型治理 1. 协议核心条款全景解析 ChatGLM2-6B 采用 分层授权模式,其核心条款可归纳为三大维度: #mermaid-svg-xgEnsN0y2TMOR0Hf {font…...
javaweb自用笔记:Vue
Vue 什么是vue vue案例 1、引入vue.js文件 2、定义vue对象 3、定义vue接管的区域el 4、定义数据模型data 5、定义视图div 6、通过标签v-model来绑定数据模型 7、{{message}}直接将数据模型message展示出来 8、由于vue的双向数据绑定,当视图层标签input里的…...
FreeRTOS 源码结构解析与 STM32 HAL 库移植实践(任务创建、删除篇)
1. FreeRTOS源码结构介绍 1.1 下载源码 点击官网地址,选择 FreeRTOS 202212.01非 LTS 版本(非长期支持版),因为这个版本有着最全的历程和更多型号处理器支持。 1.2 文件夹结构介绍 下载后主文件 FreeRTOSv202212.01 下包…...
第五节:基于Winform框架的串口助手小项目---串口收发《C#编程》
“路漫漫其修远兮,吾将上下而求索” , -----------------------WHAPPY 目标任务: 1 从本地设备列表获取串口。 RegistryKey keyCom Registry.LocalMachine.OpenSubKey("Hardware\DeviceMap\SerialComm"); RegistryKey 是.NET 框…...
CSS2.1基础学习
1.定位盒模型相关 2.浮动 3.使用定位实现三列布局(不可取,定位父级为初始包含块) 4.使用浮动实现三列布局(不可取的原因是中间主列无法优先加载) 5.圣杯布局 6.等高布局 7.双飞翼布局 8.解决IE6下fixed失效问题 9.短暂总结 10.粘连布局 11.BFC是什么 12.BFC实现两列…...
alpine linux 系统最新版安装及使用教程
1.下载镜像包 官网地址 官网下载阿里云镜像站下载华为云镜像站下载清华大学镜像站下载中科大镜像站下载 官方安装文档 2.新建虚拟机 3.编辑虚拟机并开机 4.虚拟机安装 开启虚拟机 首次启动使用root登录,没有密码 登录成功,执行 setup-alpine 命令进…...
【Hudi-SQL DDL创建表语法】
CREATE TABLE 命令功能 CREATE TABLE命令通过指定带有表属性的字段列表来创建Hudi Table。 命令格式 CREATE TABLE [ IF NOT EXISTS] [database_name.]table_name[ (columnTypeList)]USING hudi[ COMMENT table_comment ][ LOCATION location_path ][ OPTIONS (options_lis…...
[Web 安全] PHP 反序列化漏洞 —— POP 链构造思路
关注这个专栏的其他相关笔记:[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 0x01:什么是 POP 链? POP 链(Payload On Purpose Chain)是一种利用 PHP 中的魔法方法进行多次跳转以获取敏感数据的技术。它通常出现在 CTF…...
GPU/CUDA 发展编年史:从 3D 渲染到 AI 大模型时代
目录 文章目录 目录1960s~1999:GPU 的诞生:光栅化(Rasterization)3D 渲染算法的硬件化实现之路学术界算法研究历程工业界产品研发历程光栅化技术原理光栅化技术的软件实现:OpenGL 3D 渲染管线设计1. 顶点处理ÿ…...
除了DeepSpeed,在训练和推理的时候,显存不足还有什么优化方法吗?FlashAttention 具体是怎么做的
除了DeepSpeed,训练和推理时显存不足的优化方法及FlashAttention原理详解 DeepSpeed的基础内容:ZeRO分布式训练策略 一、显存不足的优化方法 1. 混合精度训练(Mixed Precision Training) 原理 使用FP16和FP32混合精度ÿ…...
GCC RISCV 后端 -- GCC 后端框架的一些理解
GCC 已经提供了一整套的编译框架,从前端(Frontend / GENERIC-Tree)对编程语言的语法语义处理,到中端(Middle-End / GIMPLE-Tree)的目标机器无关(Target Indepndent)的优化处理&#…...
庖丁解java(一篇文章学java)
(大家不用收藏这篇文章,因为这篇文章会经常更新,也就是删除后重发) 一篇文章学java,这是我滴一个执念... 当然,真一篇文章就写完java基础,java架构,java业务实现,java业务扩展,根本不可能.所以,这篇文章,就是一个索引,索什么呢? 请看下文... 关于决定开始写博文的介绍 …...
Spring框架自带的定时任务:Spring Task详解
文章目录 一、基本使用1、配置:EnableScheduling2、触发器:Scheduled 二、拓展1、修改默认的线程池2、springboot配置 三、源码分析参考资料 一、基本使用 1、配置:EnableScheduling import org.springframework.context.annotation.Config…...
DeepSeek 助力 Vue3 开发:打造丝滑的弹性布局(Flexbox)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
jwt 存在的无状态的安全问题与解决方案
背景我的需求 解决方法方案1:黑名单存在的问题解决方案问题成本估算: 方案2: 双token刷新核心解决的问题存在的问题 方案3: token与session结合成本估算 方案4: 长连接(websocket) 背景 jwt是无状态的,除了自动失效之外无法手动过期 举个例子: 当我们的token泄露或者密码泄露…...
【Python爬虫】爬取公共交通路网数据
程序来自于Github,以下这篇博客作为完整的学习记录,也callback上一篇爬取公共交通站点的博文。 Bardbo/get_bus_lines_and_stations_data_from_gaode: 这个项目是基于高德开放平台和公交网获取公交线路及站点数据,并生成shp文件,…...
Deepseek API+Python测试用例一键生成与导出-V1
在实际使用场景中,可能只需要获取需求文档中的部分内容,例如特定标题的正文部分、特定段落的表格内容,或者指定图片中的内容。为了满足这一需求,可以对文档清理工具进行优化,支持按标题提取内容、按章节提取表格和图片…...
如何为JAR设置定时重启?
AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站 前面我们说过了如何将jar交由Systemctl管理,下面我们…...
麒麟V10-SP2-x86_64架构系统下通过KVM创建虚拟机及配置虚机的NAT、Bridge两种网络模式全过程
文章目录 一、什么是虚拟化?虚拟化具有哪些优势 二、常见的虚拟化技术1、kvm介绍2、kvm工作原理3、kvm功能 三、安装kvm并启动第一个kvm机器1、环境准备2、安装kvm工具3、启动并设置开机自启 libvirtd 服务4、验证 KVM 模块是否加载5、上传系统镜像到指定目录6、网络…...
三方库总结
一、Glide 目标:熟练掌握各种使用方法,了解其设计,背后原理 如果我设计一个图片显示框架,我会怎么做? 1.加载图片资源-从网络上下载图片资源、从本地加载图片资源 如果是从网络上加载图片,需要用到相关的网…...
用DeepSeek-R1-Distill-data-110k蒸馏中文数据集 微调Qwen2.5-7B-Instruct!
下载模型与数据 模型下载: huggingface: Qwen/Qwen2.5-7B-Instruct HF MirrorWe’re on a journey to advance and democratize artificial intelligence through open source and open science.https://hf-mirror.com/Qwen/Qwen2.5-7B-Instruct 魔搭&a…...
知识图谱的推荐实现方案(Vue)
使用 Vue 实现知识图谱思维导图展示的完整方案,结合主流库和最佳实践: 一、技术选型 组件库特点适用场景MindElixir国产开源、中文文档完善、支持关系线教育类知识图谱GoJS功能强大、商业许可、适合复杂交互企业级应用(需付费)D3…...
Nessus安装
Nessus:https://pan.quark.cn/s/f5fb09b6d4fb 1.软件安装 点击安装,剩下的下一步即可。 直接下一步安装即可 2.Web端安装 会弹出一个web窗口 开始初始化 创建用户 开始初始化 3.Cracker 会弹一个黑窗口 运行完,回车即可。访问https://loc…...
【大模型基础_毛玉仁】0.概述
更多内容:XiaoJ的知识星球 【大模型基础_毛玉仁】 系列文章参考 系列文章 【大模型基础_毛玉仁】0.概述 【大模型基础_毛玉仁】1.1 基于统计方法的语言模型 更新中。。。。。。 参考 书籍:大模型基础_完整版.pdf Github:https://github.co…...
quillEditor 禁用复制粘贴图片,以及class转style等问题
<template><div><div class"search-term"><el-form :inline"true" :model"searchInfo" class"demo-form-inline"><el-form-item label"案例标题"><el-input v-model"searchInfo.titl…...
C语⾔数据类型和变量
C 语言的数据类型 类型分类: C 语言提供丰富的数据类型,包括字符型(char、signed char、unsigned char)、整型(short、int、long 等多种,且各有 signed 和 unsigned 修饰形式) 、浮点型&#x…...
centOS 环境 安装redis方法
一、准备centOS环境 参考文章:Hyper-V 安装CentOS7_代码草率了的博客-CSDN博客 二、redis官网 地址:Download | Redis 演示版本为?redis-5.0.14.tar.gz 三、redis源码编译 登录后创建soft目录 进入目录使用wget下载所需资源包 命令:w…...
【Mac】2025-MacOS系统下常用的开发环境配置
早期版本的一个环境搭建参考 1、brew Mac自带终端运行: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" Installation successful!成功后运行三行命令后更新环境(xxx是mac的username&a…...
深入理解动态绑定与多态
动态绑定介绍 Java中的动态绑定,是一种在程序运行时确定方法执行版本的过程。它与多态紧密联系。 在Java中,动态绑定通常发生在以下情况: 方法覆盖:当子类重写父类的一个方法时,调用该方法的行为会根据对象的实际类…...
【数据结构】二叉树总结篇
遍历 递归 递归三部曲: 1.参数和返回值 2.终止条件 3.单层逻辑(遍历顺序) var preorderTraversal function(root) { // 第一种let res[];const dfsfunction(root){if(rootnull)return ;//先序遍历所以从父节点开始res.push(root.val);//递归…...
Zookeeper 及 基于ZooKeeper实现的分布式锁
1 ZooKeeper 1.1 ZooKeeper 介绍 ZooKeeper是一个开源的分布式协调服务,它的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。 原语:操作系统或…...
内嵌踢脚线怎么做能省钱?
家里装修内嵌踢脚线应该怎么做?哪种做法更经济? 先回答内嵌踢脚线应该怎么做? 做内嵌踢脚线有两种办法,简单点来说就是前凸和后挖。 前凸是踢脚线安到原来墙面上,踢脚线是从墙面上凸出来的,想要实现内嵌的效…...
DeepSeek集成到VScode工具,让编程更高效
DeepSeek与VScode的强强联合,为编程效率树立了新标杆。 DeepSeek,一款卓越的代码搜索引擎,以其精准的索引和高速的检索能力,助力开发者在浩瀚的代码海洋中迅速定位关键信息。 集成至VScode后,开发者无需离开熟悉的编辑…...
大模型应用:多轮对话(prompt工程)
概述 在与大型语言模型(如ChatGPT)交互的过程中,我们常常体验到与智能助手进行连贯多轮对话的便利性。那么,当我们开启一个新的聊天时,系统是如何管理聊天上下文的呢? 一、初始上下文的建立 1. 创建新会…...
洛谷 P1601 A+B Problem(高精)详解c++
我们之前做题碰到的数据范围一般是10^9,多点会达到10^18级别,处理10^9用int就可以存下,10^18次方要用到long long,接着解决加减乘除的问题,但是当数据范围达到了10^10^6的时候,当数据的值特别⼤,…...
【云原生】Spring Cloud是什么?Spring Cloud版本介绍
什么是SpringCloud 上一章节介绍了总体的SpringCloud的总体学习章节,因为最近项目刚好需要用到SpringCloud来搭建微服务项目、所以就跟着大家一起来再学习巩固下SpringCloud的相关知识 SpringCloud是基于SpringBoot提供了一套微服务解决方案,包括服务注…...
最节省成本的架构方案:无服务器架构
无服务器架构(Serverless Architecture)是一种颠覆性的云计算执行模型,它允许开发者专注于编写和部署代码,而无需担心底层服务器基础设施的管理。这种架构以其按需付费、自动伸缩和简化部署等优势,在成本优化方面表现出…...
C++入门续集:
1. 缺省参数: 我们看我们的上图,我们可以看我们的函数Func,我们可以看到我们的函数里面的参数写的是int a 0;这个写法是我们没有见过的,我们之前在C语言里面只见到过说是函数里面会设置参数,但是参数是没有…...
线代[9]|线性代数主要内容及其发展简史(任广千《线性代数的几何意义》的附录1)
文章目录 向量行列式矩阵线性方程组二次型 向量 向量又称为矢量,最初应用与物理学。很多物理量如力、速度、位移以及电场强度、磁感应强度等等都是向量。大约公元前350年前,古希腊著名学者亚里士多德就知道了力可以表示成向量,两个力的组合作…...
C++ Primer 动态内存与智能指针
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
AI在原型设计中的革命性应用:效率与创新的双重突破
引言 在数字化转型加速的今天,产品开发周期被压缩至前所未有的程度。原型设计作为产品开发的核心环节,其效率和质量直接影响最终产品的市场竞争力。传统原型设计流程依赖人工绘制、反复修改和用户测试,耗时且成本高昂。而人工智能࿰…...
网络学习(四)HTTPS中,SSL的单向认证与双向认证
目录 一、什么是SSL?1.1 SSL 的主要功能1.2 SSL 的工作原理1.3 SSL 的核心组件1.4 SSL 的应用场景1.5 SSL 与 TLS 的区别 二、SSL 单向认证、双向认证2.1 SSL 单向认证2.2 SSL 双向认证2.3 总结:SSL 单向认证和双向认证的区别 一、什么是SSL?…...
分类任务和回归任务的区别
分类任务和回归任务是机器学习中两种常见的监督学习任务,尽管它们都属于预测性的分析,但它们的目标和应用场景存在显著的差异。 分类任务 定义:分类任务是指将输入样本映射到一个有限且离散的类别集合中的过程。目标是对数据进行分类&#…...
android接入rocketmq
一 前言 RocketMQ 作为一个功能强大的消息队列系统,不仅支持基本的消息发布与订阅,还提供了顺序消息、延时消息、事务消息等高级功能,适应了复杂的分布式系统需求。其高可用性架构、多副本机制、完善的运维管理工具,以及安全控制…...
V4L2框架基础
一、V4L2视频设备驱动基础 1.V4L2是专门为Linux设备设计的整合视频框架(其主要核心在Linux内核,相当于Linux操作系统上层的视频源捕获驱动框架)。为上层访问系统底层的视频设备提供一个统一的标准接口。V4L2驱动框架能够支持多种类型&#x…...
【微知】如何通过mlxlink查看Mellanox网卡和光模块相关的信息?( mlxlink -d 01:00.0 -m)
背景 通过mlxlink可以查看Mellanox网卡的一些链路信息和硬件信息,也可以查看所插入的光模块的一些信息。 兄弟篇通过ethtool查看的方法:如何查看Mellanox网卡上的光模块的信息? 命令 mlxlink -d 01:00.0 -mman手册介绍: 如果…...
使用pytorch和opencv根据颜色相似性提取图像
需求:将下图中的花朵提取出来。 代码: import cv2 import torch import numpy as np import timedef get_similar_colors(image, color_list, threshold):# 将图像和颜色列表转换为torch张量device torch.device(cuda if torch.cuda.is_available() el…...
HTML label 标签使用
点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签,可以使表单更加友好和易于使用,同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…...
SQL注入的分类靶场实践
前言 SQL 注入(SQL Injection)是一种常见且危险的 Web 安全漏洞,攻击者通过在输入字段中插入恶意 SQL 代码,能够绕过应用程序的验证机制,直接操纵数据库。本文将介绍 SQL 注入的分类,并通过 Pikachu 靶场进…...