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

Torch核心数据结构Tensor(张量)

1 基本概念

tensor是一个多维数组,类似于NumPy中的ndarray,但tensor可以在GPU上进行高效计算,这是它与ndarray的重要区别之一。它可以表示标量(0维张量)、向量(1维张量)、矩阵(2维张量)以及更高维度的张量,广泛应用于表示模型的输入、输出、参数等。下图比较形象的给出了各种张良:

image

1.1 创建方式

1. 直接创建

通过torch.tensor()函数,可以直接从python列表或NumPy数组创建张量:

import torch
import numpy as np# 从Python列表创建张量
data = [1, 2, 3]
x = torch.tensor(data)# 从NumPy数组创建张量
arr = np.array([4, 5, 6])
y = torch.tensor(arr)

2. 使用特定函数创建

torch.zeros():创建全 0 张量。例如,torch.zeros((3, 4))会创建一个形状为(3, 4)(3 行 4 列)的全0矩阵。

torch.ones():创建全 1 张量。例如,torch.ones((2, 2))会生成一个2x2的全1矩阵。

torch.rand():创建一个由在区间[0, 1)上均匀分布的随机数填充的张量。比如torch.rand((2, 3))会得到一个2行3列的随机数张量。

torch.arange():类似于 Python 的range()函数,创建一个等差序列的张量。例如torch.arange(0, 10, 2)会生成tensor([0, 2, 4, 6, 8])。

import torchzero_tensor = torch.zeros((3, 4))
print("zero_tensor:\n", zero_tensor)ones_tensor = torch.ones((2, 2))
print("ones_tensor:\n", ones_tensor)rand_tensor = torch.rand((2, 3))
print("rand_tensor:\n", rand_tensor)arange_tensor = torch.arange(0, 10, 2)
print("arange_tensor:\n", arange_tensor)

1.2 张量属性

形状(shape):通过.shape属性获取张量的形状,例如对于x = torch.tensor([[1, 2], [3, 4]]),x.shape返回torch.Size([2, 2]) ,表示这是一个 2 行 2 列的张量。

数据类型(dtype):通过.dtype属性获取张量的数据类型,常见的数据类型包括torch.float32、torch.int64、torch.bool等。创建张量时也可以指定数据类型,如torch.tensor([1, 2, 3], dtype=torch.float32)。

设备(device):通过.device属性获取张量所在的设备,是在CPU还是在GPU上。可以通过.to()方法将张量移动到不同设备,如x = x.to('cuda')(前提是系统支持CUDA且安装了相关驱动)将张量x移动到GPU上进行计算。

requires_grad:该属性是张量的核心属性,用于控制是否追踪该张量的计算历史并计算梯度,是实现自动微分(Automatic Differentiation)的关键开关,如果requires_grad为True,则会为张量分配grad属性,用于存储其梯度。

is_cuda:是一个布尔属性,用来判断一个张量是否在 GPU(CUDA 设备) 上。

1.3 张量操作

索引和切片:与 Python 列表和 NumPy 数组类似,张量可以进行索引和切片操作。例如对于x = torch.tensor([[1, 2, 3], [4, 5, 6]]),x[0, 1]返回第一行第二列的元素2;x[:, 1]返回第二列的所有元素。

数学运算:支持各种数学运算,如加法、减法、乘法、除法等。既可以是张量与标量的运算,也可以是张量与张量之间的运算。例如x + 2表示张量x的每个元素都加 2;x + y(x和y是形状相同的张量)表示对应元素相加。

维度操作:torch.unsqueeze(input, dim)增加维度,例如x形状为Size([3]),则torch.unsqueeze(x, 0)会在索引为0的位置上增加一个维度,形状变为Size([1, 3]),而torch.unsqueeze(x, 1)会在索引为1的位置上增加一个维度,形状变为Size([3, 1]),这里dim参数的取值范围为[-n, n-1](n是原始张量的维度数),非负数索引时,dim=0对应最外层维度,dim=1对应次外层维度,负数索引时,dim=-1对应最内层维度,dim=-2对应次内层维度,以此类推;torch.squeeze(input, dim=None),当不指定dim时,删除张量中所有大小为1的维度,当指定dim时,仅删除第dim个维度(前提是该维度的大小为1,否则不做任何改变);torch.transpose(input, dim0, dim1),转置张量,即交换张量中指定的两个维度,而保持其他维度的顺序不变;torch.reshape(input, shape),改变张量的形状,如对于形状为Size([3, 2])(3行2列)的x,torch.reshape(x, (2, 3))将张量x重塑为2行3列的形状。分析可知,以上操作都是在不改变张量元素数据及总数的前提下,重新组织张量的维度结构。

1.4 张量方法

其实对于相应的张量操作,张量自身都有对应的方法。

1. 索引与切片

index_select(dim, index)

按索引在指定维度上选择元素,示例代码如下:

import torchx = torch.tensor([[1,2],[3,4],[5,6]])
idx = torch.tensor([0,2])
print(x.index_select(0, idx))  # 选择第0和第2行,输出tensor([[1, 2], [5, 6]])

masked_select(mask)

根据布尔掩码选择元素(返回1D张量),示例代码如下:

import torchx = torch.tensor([[1,5],[3,4]])
mask = x > 2
x.masked_select(mask)       # 输出tensor([5, 3, 4])

gather(dim, index)

沿指定维度收集元素(更灵活的索引方式),该函数的核心逻辑:沿指定维度(dim),根据索引张量(index)收集输入张量(x)中的元素,输出张量的形状与索引张量(index)的形状完全一致,所以这里idx必须满足维度和x相同,但是每个维度上元素个数不大于x相应维度上元素个数。

import torchx = torch.tensor([[[1,5], [2, 6]], [[3,7], [4,8]]])
idx=torch.tensor([[[1]],[[0]]])
print(x.gather(2, idx))
print(x.gather(1, idx)) 
print(x.gather(0, idx))

代码中,x形状为 (2, 2, 2),即:dim=0(第 1 维),dim=1(第 2 维),dim=2(第 3 维)大小都为 2。

idx形状为(2, 1, 1),即dim=0为2,dim=1和dim=2都为1,其内容为:

idx[0,0,0] = 1  # 第0行、第0列、第0深的索引值
idx[1,0,0] = 0  # 第1行、第0列、第0深的索引值

gather的核心逻辑是,对于输出张量的每个位置 (i,j,k),其值由以下规则确定:
output[i,j,k] = x[i,j,k] 中,将参数dim维度的索引替换为 idx[i,j,k],即:
若 dim=0:output[i,j,k] = x[ idx[i,j,k], j, k ]
若 dim=1:output[i,j,k] = x[ i, idx[i,j,k], k ]
若 dim=2:output[i,j,k] = x[ i, j, idx[i,j,k] ]

以x.gather(2, idx)(沿dim=2收集)为例,dim=2是 “深维度”(最内层维度),规则:output[i,j,k] = x[i,j, idx[i,j,k]],输出形状与idx一致(2,1,1),具体计算:

i=0, j=0, k=0:idx[0,0,0]=1 → output[0, 0, 0] = x[0,0,1] = 5(第 0 行、第 0 列、第 1 深的值)

i=1, j=0, k=0:idx[1,0,0]=0 → output[1, 0, 0] = x[1,0,0] = 3(第 1 行、第 0 列、第 0 深的值)

结果:tensor([[[5]], [[3]]])。

同理,对于x.gather(1, idx)(沿dim=1收集),dim=1是“列维度”(中间维度),规则:output[i,j,k] = x[i, idx[i,j,k], k]。输出形状为(2,1,1),具体计算:

i=0, j=0, k=0:idx[0,0,0]=1 → output[0, 0, 0] = x[0,1,0] = 2(第 0 批次、第 1 行、第 0 列的值)

i=1, j=0, k=0:idx[1,0,0]=0 → output[1, 0, 0] = x[1,0,0] = 3(第 1 批次、第 0 行、第 0 列的值)

结果:tensor([[[2]], [[3]]])。

最后,x.gather(0, idx)(沿dim=0收集),dim=0是 “行维度”(最外层维度),规则:output[i,j,k] = x[ idx[i,j,k], j, k ]。输出形状为(2,1,1),具体计算:

i=0, j=0, k=0:idx[0,0,0]=1 → output[0, 0, 0] = x[1,0,0] = 3(第 1 行、第 0 列、第 0 深的值)

i=1, j=0, k=0:idx[1,0,0]=0 → output[1, 0, 0] = x[0,0,0] = 1(第 0 行、第 0 列、第 0 深的值)

结果:tensor([[[3]], [[1]]])。

一下代码可以直观的给出张量x立体示意图:

import torch
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D# 设置中文字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
# 解决负号显示问题(可选)
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号# 创建张量
x = torch.tensor([[[1,5], [2, 6]], [[3,7], [4,8]]])# 转换为numpy数组以便绘图
x_np = x.numpy()# 创建3D图形
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')# 获取张量的维度
depth, rows, cols = x_np.shape# 创建坐标网格
x_coords, y_coords, z_coords = np.meshgrid(np.arange(rows), np.arange(cols), np.arange(depth), indexing='ij')# 展平坐标和值
x_flat = x_coords.flatten()
y_flat = y_coords.flatten()
z_flat = z_coords.flatten()
values = x_np.flatten()# 绘制点
scatter = ax.scatter(x_flat, y_flat, z_flat, c=values, s=500, cmap='viridis', alpha=0.8)# 添加标签
for i, (x, y, z, val) in enumerate(zip(x_flat, y_flat, z_flat, values)):ax.text(x, y, z, f'{val}', fontsize=12, ha='center', va='center', color='white')# 设置坐标轴标签
ax.set_xlabel('行 (Row)')
ax.set_ylabel('列 (Column)')
ax.set_zlabel('深度 (Depth)')# 设置坐标轴刻度
ax.set_xticks(np.arange(rows))
ax.set_yticks(np.arange(cols))
ax.set_zticks(np.arange(depth))# 添加标题
ax.set_title('3D张量可视化\n形状: {}'.format(x_np.shape))# 添加颜色条
cbar = fig.colorbar(scatter, ax=ax, shrink=0.5, aspect=20)
cbar.set_label('元素值')# 设置视角以便更好地观察
ax.view_init(elev=20, azim=45)plt.tight_layout()
plt.show()
gather.py

代码运行后如下所示:

b2445e2db220ef7b82f8ad3c44277795

2. 数学运算

x.add(y):对应元素相加

x.sub(y):对应元素相减

x.mul(y):对应元素相乘

x.div(y):对应元素相除

x.remainder(y):对应元素取余

x.pow(y):对x每个元素求y次幂

x.sqrt():对x每个元素求平方根

x.exp():对x每个元素求自然指数(e^x)

x.mean():求平均值,要求x数据类型为float或者complex

x.sum():求和

x.max()/x.min():求最大/最小值

x.std()/var():求标准差/方差,要求x数据类型为float或者complex

3. 维度相关

该部分方法对应维度操作部分,不再详细介绍。

4. 内存与类型

contiguous()

将张量转为内存连续的形式(用于view等方法前),以张量x = torch.tensor([[1, 2, 3], [4, 5, 6]])为例,它是contiguous意味着沿第0维(行)移动1步,需跳过3个元素;沿第1维(列)移动1步,需跳过1个元素。当张量经过某些维度操作(如 transpose、permute、unsqueeze/squeeze 等)后,可能会变成非连续张量(内存中元素的存储顺序与逻辑顺序不一致)。此时,若调用某些要求张量连续的操作(如 view、resize_ 等),会抛出错误,这种情况下就需要调用contiguous()进行转换。

to(dtype)

转换张量数据类型(如float32→float64)。

cpu()/cuda()

将张量转移到 CPU 或 GPU(需 CUDA 支持)。

5. 原地操作

多数方法有后缀_的原地版本(直接修改自身,不返回新张量),如x.add_(3)等价于 x = x + 3。

6. 其他方法

clone():创建张量的副本(深拷贝,不共享内存)。

detach():返回与原张量共享数据,但不关联计算图的张量(用于冻结参数)。

numpy():将张量转为 NumPy 数组(CPU 张量适用,共享内存)。

flatten(start_dim=0, end_dim=-1):展平指定范围的维度。

2 张量自动求导(Autograd)

autograd是实现自动微分(Automatic Differentiation) 的核心系统,它能自动计算张量的梯度,是训练神经网络的基础。

2.1 核心概念

1. 计算图(Computational Graph)

PyTorch在执行张量运算时,会动态构建一张有向无环图 (DAG)

  • 节点 (Node):张量(数据)

  • 边 (Edge):操作 (Operation, Function)

例如:

import torch
x = torch.tensor(2.0, requires_grad=True)
y = x**2 + 3*x + 1        # 向前传播,会创建计算图

其计算过程可以分解为:

1)a = x**2 (平方运算)

2)b = 3*x (乘法运算)

3)c = a + b (加法运算)

4)y = c + 1 (加法运算)

则其对应的计算图DAG可表示如下:

    x (requires_grad=True)│├─── PowBackward (2) ─── a = x²│└─── MulBackward (3) ─── b = 3*x││a       b\     /AddBackward ─── c = a + b││  1/AddBackward ─── y = c + 1

叶子节点

x:初始张量,requeires_grad = True,梯度计算起点。

中间节点

PowBackward:x**2 操作,记录幂运算的梯度计算规则

MulBackward:3*x 操作,记录标量乘法的梯度计算规则

AddBackward (1):a + b 操作,记录加法的梯度计算规则

AddBackward (2):c + 1 操作(常数1不参与梯度计算)

2. 前向传播(Forward Pass)

在该过程中会创建计算图,同时,计算运算的输出张量,记录运算的元信息(如运算类型、输入张量、梯度函数),用于后续反向传播,以上代码中第3行就是前向传播。

3. 反向传播 (Backward Pass)

而在反向传播中,tensor variable需要缓存原来的tensor来计算反向传播梯度,如果想要计算各个variable的梯度,只需调用根节点variable的backward方法,autograd会自动沿着计算图反向传播,计算每一个叶子节点的梯度。

tensor.backward(gradient=None, retain_graph=None, create_graph=False, inputs=None)

主要有如下参数:

gradient:梯度初始值,当根节点是标量时,gradient可省略,当根节点是高维张量时,形状与variable一致,对于y.backward()。

retain_graph:是否保留计算图(支持多次反向传播),通常反向传播以后,计算图等相关中间结果会被释放清空,通过该参数可指定不清空,以用来多次反向传播。即复用已保留的计算图,再次计算梯度,新梯度与已有梯度累加。

create_graph:是否创建梯度的计算图(支持高阶导数),当该参数为False时,仅计算梯度值,不记录梯度的计算过程,无法对梯度再求导,当为True时,会构建梯度的计算图,允许对梯度进行二次求导(二阶导数)、三次求导(三阶导数)等高阶导数计算。

inputs:指定需要计算梯度的叶子节点(优化计算效率)。

当调用 y.backward() 时,会从输出张量y开始,沿计算图反向遍历,依次调用各操作的链式法则,最终把梯度累积到x.grad里。

y → AddBackward(2) → AddBackward(1) → ├── (常数1,无梯度)└── c → AddBackward(1) → ├── a → PowBackward → x└── b → MulBackward → x

根据链式法则,有:

∂y/∂x = ∂y/∂c * ∂c/∂x= ∂y/∂c * ∂c/∂a * ∂a/∂x + ∂y/∂c * ∂c/∂b * ∂b/∂x= 1 * 1 * (2x) + 1 * 1 * 3= 2*2 + 3 = 7

可以在之前的代码中增加验证:

y.backward()   # 计算图在backward()后被销毁(除非retain_graph=True)
print(x.grad)   # 输出: tensor(7.)

需要说明的是:DAG在PyTorch中是动态构建的,每次前向传播都会重新创建,但在反向传播后会被自动销毁(除非指定retain_graph=True)。

2.2 关键机制与特性

1. 动态计算图(Dynamic Graph)

PyTorch的计算图是动态构建的:每次前向传播都会重新构建计算图,支持在运行时根据条件(如if、for)修改图结构,使得调试和修改模型变得更加容易。与TensorFlow 1.x 的静态图(计算图在开始执行之前构建完成,并且不会改变)不同,更灵活且易于调试,新版本的TensorFlow也已经支持动态图。

import torchx = torch.tensor(1.0, requires_grad=True)
for i in range(3):y = x * 2if i % 2 == 0:y = x * 3  # 条件分支修改计算图
    y.backward()print(x.grad)  # 每次反向传播后梯度累积x.grad.zero_()  # 清零梯度,避免累积

以上程序输出:

tensor(3.)
tensor(2.)
tensor(3.)

2. 梯度累积与清零

多次调用backward()会累积梯度(适用于大 batch 拆分训练),需通过.grad.zero_()手动清零梯度(否则会影响下一轮计算)。

3. 非叶子节点的梯度释放

中间节点(非叶子节点)的梯度在反向传播后会被自动释放,以节省内存。若需保留,可使用retain_grad()方法:

import torchx = torch.tensor(1.0, requires_grad=True)
y = x * 4
y.retain_grad()  # 保留y的梯度
z = y * 2
z.backward()
print(y.grad)  # 输出:tensor(1.) → dz/dy = 1
print(x.grad)

以上代码能正确输出结果,但是如果将y.retain_grad()这行注释掉,则会提示一下错误:

image

4. detach()方法

tensor.detach()会返回一个与原张量数据相同,但requires_grad=False的新张量,且脱离计算图,不再参与梯度传播:

x = torch.tensor(2.0, requires_grad=True)
y = x.detach()  # y.requires_grad=False,与计算图分离
z = y * 3
z.backward()  # 报错:z不依赖任何requires_grad=True的张量

2.3 Function类:梯度计算的核心

autograd的梯度计算依赖Function类,每个运算(如加法、乘法)都对应一个Function子类,其中:

forward()方法:定义前向传播的计算逻辑;

backward()方法:定义反向传播的梯度计算逻辑(即局部梯度)。

当执行y = x * w时,autograd会隐式创建一个MulBackward(乘法对应的Function)实例,记录输入x、w,并在反向传播时调用其backward()方法计算梯度。

目前绝大多数函数都可以使用autograd实现反向求导,但如果需要自己写一个复杂的函数,不支持自动反向求导时,这时需写一个Function,实现它的前向传播和反向传播代码,示例代码如下:

import torch
from torch.autograd import Functionclass MultiplyAdd(Function):                                 @staticmethoddef forward(ctx, w, x, b):                              ctx.save_for_backward(w,x)output = w * x + breturn output@staticmethoddef backward(ctx, grad_output):                         w,x = ctx.saved_tensorsgrad_w = grad_output * xgrad_x = grad_output * wgrad_b = grad_output * 1return grad_w, grad_x, grad_b                       x = torch.ones(1)
w = torch.rand(1, requires_grad = True)
b = torch.rand(1, requires_grad = True)
print(x, w, b)
# 开始前向传播
z=MultiplyAdd.apply(w, x, b)
# 开始反向传播
z.backward()# x不需要求导,中间过程还是会计算它的导数,但随后被清空
print(x.grad, w.grad, b.grad)

分析如下:

1. 自定义的Function需要继承autograd.Function,没有构造函数__init__,forward和backward函数都是静态方法;

2. backward函数的输出和forward函数的输入一一对应,backward函数的输入和forward函数的输出一一对应;

3. backward函数的grad_output参数即torch.autograd.backward中的gradient,w的梯度grad_w是上游梯度grad_output乘以 x(对w求导,d(output)/dw = x);求x的梯度grad_x,根据 x 是否需要求导(ctx.x_requires_grad),若需要,grad_x = grad_output * w(对 x 求导,d(output)/dx = w);否则为 None,上述实例中requires_grad默认为False,所以x梯度输出是None;对于b的梯度,grad_b = grad_output * 1,b 的梯度是上游梯度乘以 1(对 b 求导,d(output)/db = 1);

4. 如果某一个输入不需要求导,直接返回None,如forward中的输入参数x_requires_grad显然无法对它求导,直接返回None即可;

5. 反向传播可能需要利用前向传播的某些中间结果,需要进行保存,否则前向传播结束后这些对象即被释放。

 

参考

1. https://www.runoob.com/pytorch/pytorch-basic.html

2. https://blog.csdn.net/qq_43328040/article/details/108421469

相关文章:

Torch核心数据结构Tensor(张量)

本文pytorch的入门系列文章第一篇,首先介绍了张量tensor这一基础内容,尤其详细介绍其关键概念自动求导autograd原理及简单应用。1 基本概念 tensor是一个多维数组,类似于NumPy中的ndarray,但tensor可以在GPU上进行高效计算,这是它与ndarray的重要区别之一。它可以表示标量…...

vue - 进阶

响应式: 进阶 customRef() 创建一个自定义的 ref,显式声明对其依赖追踪和更新触发的控制方式。类型 function customRef<T>(factory: CustomRefFactory<T>): Ref<T>type CustomRefFactory<T> = (track: () => void,trigger: () => void ) =>…...

读书笔记:为什么你的数据库有时不用索引?一个关键参数告诉你答案

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学习《Expert Oracle Database Architecture Techniques and…...

MacOS升级15.2后的问题(一):安装第三方下载的软件,提醒文件已损坏

安装第三方下载的软件,提醒文件已损坏解决步骤: 第一步,重启系统,command+r 持续按住,进入恢复模式,打开左上角实用工具-终端,进行禁用SIP操作:1 csrutil disable第二步,Macos隐私安全性,打开允许任何来源指令:1 sudo spctl --master-disable完成后即可看见(任何来…...

Playwright MCP浏览器自动化教程

你是否曾厌倦在编程软件和浏览器之间反复切换,只为了检查AI生成的代码能否正常运行?现在,有了Playwright MCP(Model Context Protocol),你可以直接让AI自己操作浏览器,查看自己写的代码运行效果,并自行修复问题。 本文将手把手教你如何配置和使用Playwright MCP,让AI成…...

故障分析:ORA-00900 修改props$中字符集导致

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。故障分析:ORA-00900 修改props$中字符集导致 某天在一个群里面看到有人…...

Unstable Twin - TryHackMe

Unstable Twin 一、信息收集 使用nmap对网站ip的开放端口进行扫描 nmap -sS -sV -A -Pn 10.10.187.113 开放了22端口和80端口 使用dirsearch扫描一下看看还有没有其他目录 dirsearch -u http://10.10.187.113 -e php,html,txt -t 100这里我访问网站网站显示一片空白课,我以为…...

单片机实现挡位调节

简易挡位调节模块 1、初始化硬件这里就不过多赘述了,去看我之前的帖子,我这篇帖子选择TIM2的1通道PWM的简单应用2、触发方式 (1)中断 I 初始化硬件启用按钮的中断在主函数外写入中断回调函数void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){uint16_t value;__HAL_TIM_SET_CO…...

完整教程:从 WildCard 野卡到 gptplus.plus:一次解决 OpenAI 支付难题的实战复盘,轻松搞定Gpt充值

完整教程:从 WildCard 野卡到 gptplus.plus:一次解决 OpenAI 支付难题的实战复盘,轻松搞定Gpt充值pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…...

阿里 Qoder 新升级,Repo Wiki 支持共享、编辑和导出

Repo Wiki 正式上线新功能:支持 Wiki 共享、编辑和导出。为了让知识更好地在团队中流转,Qoder 提供了 Wiki 共享能力。当用户在本地生成 Wiki 时,会自动在代码库中创建一个专属目录,只需将该目录推送至代码仓库,即可将生成的文档轻松共享给团队成员,实现协作共建。过去两…...

长城杯WriteUp

文曲签学 提示是穿透并且双写,所以直接抓包在后台进行穿透,获得flagEZ_upload exp: 先创建软链接,然后上传shell import tarfile import os from io import BytesIO# Webshell 内容 webshell_content = b<?php @eval($_POST["cmd"]); ?> webshell_name = …...

vite取别名@

在 vite.config.ts 中: import path from "path"; export default defineConfig({// 取别名resolve: {alias: {"@": path.resolve(__dirname, "./src")}} });在 tsconfig.node.json、tsconfig.json 以及 tsconfig.app.json 中:"compilerO…...

JavaScript数据网格方案AG Grid 34.2 发布:更灵活的数据结构、更流畅的大数据交互与全新 UI 体验

JavaScript数据网格方案AG Grid 正式发布 34.2 版本,本次更新为开发者带来了更灵活的数据分组方式、更顺畅的大数据集交互体验,以及更直观的 UI 提示与操作反馈。近日,JavaScript 数据表格方案AG Grid版本,本次更新为开发者带来了更灵活的数据分组方式、更顺畅的大数据集交…...

BOE(京东方)IPC电竞嘉年华盛典圆满收官 第三届无畏杯总决赛引领电竞生态发展热潮

9月12日,BOE IPC电竞嘉年华盛典暨第三届BOE无畏杯《无畏契约》挑战赛总决赛在北京中关村国际创新中心圆满收官,来自大众赛道的“肌肉瞄准”战队最终赢得冠军奖杯。作为BOE(京东方)全球创新伙伴大会2025(BOE IPC2025)中备受瞩目的标杆性活动,本届赛事首次以《无畏契约》全…...

P1886 滑动窗口 /【模板】单调队列

P1886 滑动窗口 /【模板】单调队列做题思路:#include <bits/stdc++.h>using namespace std; #define int long longconst int maxn = 1e6 + 10;int n,k,a[maxn];deque<int> dp; //双端队列,普通队列队尾无法删除 signed main(){ ios::sync_with_stdio(0); cin.t…...

kingbase金仓数据库docker部署完整步骤

使用docker: docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 docker镜像包: 下载地址:https://ww…...

glTF/glb功能、应用和 5 个基本最佳实践

添加图片注释,不超过 140 字(可选) 在 3D 内容重新定义我们在线购物、学习和互动方式的世界中,glTF 文件格式已成为行业标准。glTF(GL 传输格式的缩写)由 Khronos Group(也是 WebGL 和 Vulkan 的幕后黑手)创建的,被设计为“3D 的 JPEG”,以紧凑、高效的方式提供针对 …...

Spotify 音乐ML练习数据集含158 个特征,11

数据概览与特征说明 本 Spotify ML 练习数据集专为机器学习初学者设计,旨在提供端到端的 ML 管道实践资源。原始数据含 24 个特征,经处理后扩展至 158 个工程特征,涵盖 11.4 万 + 首 Spotify 歌曲信息。 ,涵盖流行度评分、音频特征、流派标签、聚类目标及艺术家统计量。 核…...

abc423

AC 6 (ABCDEF), Score 2050, Penalty 97:57(2), Rank 419, Rating 1358→1415(+57)不行了这场 abc 对我太友好了。 B 吃一发罚时是因为忘记判全 0 来着。 D 直接优先队列就可以。 E 一眼莫队感觉 3e5 很能跑就不动脑子往上写了( F 二项式反演秒了,但是把 \(m\) 打成 \(n\) 一…...

AI辅助分析HP DL360 GEN7 服务器安装USB3扩展卡

AI辅助分析HP DL360 GEN7 服务器安装USB3扩展卡背景 之前我们文章写过惠普HP DL360 GEN7服务器扩展显卡,与解决服务器磁盘阵列问题,今天我们尝试增加一块扩展USB3.0的扩展卡。 我们通过AI搜索先调查研究。实践https://metaso.cn/s/rh2BUAQ文档对话原始文档是英文的,我们…...

AI 应用开发,不就是调个接口么?

AI 技术发展日新月异,对程序员的要求也在不断提高。**AI 相关知识不再只是算法工程师需要了解,而是每个程序员都必须掌握的基本技能**。大家好,我是程序员鱼皮。 由于 AI 的流行,很多公司开始搞起了 AI 相关的业务,或者给老项目加个 AI 相关的功能。 这也给开发方向的程序…...

95.费解的开关

95.费解的开关 用枚举的思想,把第一行先枚举了 (通过: for (int op = 0; op < 32; op ++ )for (int i = 0; i < 5; i ++ )if (op >> i & 1)) 根据第i行去trun第i+1行来改变第i行 trun的改变利用了偏移量来简化 #include <iostream> #include <alg…...

最新药物数据集下载:来自Drugs

数据集概述与重要性 在当今医疗健康领域,数据驱动的决策变得越来越重要。药物相关结构化数据集作为连接医药研究与人工智能应用的关键桥梁,为研究人员、数据科学家和医疗从业者提供了宝贵的资源。本数据集从权威医药网站Drugs.com提取并经过严格预处理,包含了丰富的药物信息…...

【VPX361】基于3U VPX总线架构的XCZU47DR射频收发子模块

产品概述 VPX361是一款基于3U VPX总线架构的8路射频收发子模块,板卡采用1片XCZU47DR RFSOC来实现8路射频信号的高速采集、信号生成以及处理,并进行智能目标识别。该板卡的PS端支持1组72位DDR4 SDRAM,PL端支持1组32位DDR4 SDRAM,支持1片32GB EMMC存储单元,支持2片QSPI FLAS…...

自动驾驶ADAS数据集 13万张高清道路车辆识别图像 覆盖多场景智能交通应用 支持目标检测图像识别模型训练与AI视觉算法开发

引言与背景 在自动驾驶、智能交通和车联网等领域,高精度车辆识别是安全决策的前提。无论是面向全自动驾驶,还是日益普及的高级驾驶辅助系统(ADAS),都依赖大量多场景、多车型的标注数据进行模型训练。 然而,现实中存在两个挑战:场景不均衡 ——多数数据集中夜间、雨雾等极…...

Norwood-Hamilton男性脱发分级图像集|2400+张多角度高清头皮图像|涵盖7类脱发诊断标注|适用于AI诊断工具开发、皮肤科研究与植发产品研发|包含5角度标准化拍摄、支持秃顶早期检测

数据集概述 男性脱发(雄激素性脱发)是困扰全球约50%男性的常见皮肤问题,准确诊断和分级对治疗方案的选择至关重要。本数据集针对这一临床需求,系统性地收集了2400多张高质量男性脱发头皮图像,为AI辅助诊断提供了标准化训练资源。 所有图像均从五个标准化角度(前额、顶部、…...

AI生成文本检测数据集:基于不平衡数据集(人类94% vs AI 6%)的高效机器学习模型训练,涵盖ChatGPT、Gemini等LLM生成内容

引言与背景 随着以ChatGPT和Gemini为代表的大型语言模型(LLM)的快速发展,人工智能生成文本(AIGC)已广泛应用于学术研究、内容创作、新闻传播和日常交流等多个领域。这些模型生成的内容流畅度和逼真度极高,不仅显著提升了信息生产效率,同时也带来了学术不端、虚假信息泛滥…...

阶跃星辰开源Step-Video-T2V模型:300亿参数打造高保真视频生成新标杆

阶跃星辰开源Step-Video-T2V模型:300亿参数打造高保真视频生成新标杆 在AI视频生成技术快速发展的当下,国内AI公司阶跃星辰正式宣布开源其最新研发的Step-Video-T2V文生视频模型。这款参数规模高达300亿的大模型能够生成长达204帧的540P高清视频,在多个关键指标上展现出行业…...

多多报销小程序系统详解

1. 概述总结 多多报销是一款基于微擎系统交付的商家运营工具集成小程序,支持微信小程序,采用 PHP5.4、PHP5.5、PHP7.1 开发,源码未加密,属于官方正品。其核心是打造另类商家运营模式,集成多种运营工具,目前主要采用排队返现模式,后续将扩展平台积分模式、每天返现、抽奖…...

第0章 矿卡EBAZ4203爆改zynq开发板介绍和VIVADO的安装

前言 STM32暂时没有感兴趣的点来写了,后续可能会做LVGL的移植和开发,开新坑吧,也是以前工作时玩的板子 由于本人较懒,记录主要是过程,由于zynq的比stm32做的人少很多,资料也少很多,我会简要介绍原理,操作流程主要由图片加少量文字组成一、想法萌发 在查资料时看到有人用…...

德创恋爱话术宝典介绍

1. 概述总结 德创恋爱话术宝典是一款基于微擎系统的应用,微擎系统是一款基于 PHP 开发的开源应用生态系统,主要用于快速搭建微信公众号、小程序等应用,同时支持 Web 系统开发与部署。德创恋爱话术宝典支持无限多开,适用于微信公众号、微信小程序、PC 等类型,支持 PHP7.3。…...

无痕检测是否注册iMessage服务,iMessages数据筛选,iMessage蓝号检测协议

一、实现iMessage蓝号数据筛选的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号…...

机器学习回顾(二)——KNN算法 - 教程

机器学习回顾(二)——KNN算法 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…...

利用langchain创建信息检索链对话应用

以下内容有AI生成内容,请注意区分信息检索链 信息检索链三步流程走向图 flowchart TDA[用户输入问题] --> B[第一步: 查询优化]subgraph B [查询优化]B1[原始用户问题] --> B2[LLM分析并优化]B2 --> B3[生成多个搜索查询]endB --> C[第二步: 信息检索]subgraph C …...

不同的.cs文件的命名空间相同

在 .NET(包括 C#)里,“同一个命名空间”完全可以散落在多个 .cs 文件——甚至散落在多个不同的项目/程序集里。不同文件但同一命名空间的类型访问级别受限 → internal 仍互相可见(同一程序集内);public 随便用;private/file 只能在声明文件内。命名空间是“逻辑地址”,…...

MyEMS:开源的力量,如何为企业能源管理带来颠覆性变革?

在能源成本不断上涨和碳中和成为全球共识的今天,高效能源管理已成为企业的核心竞争力。然而,传统能源管理系统往往存在成本高昂、封闭僵化、难以定制等问题,让许多企业望而却步。正是在这样的背景下,MyEMS 作为一款完全开源的能源管理系统,正在以其独特优势重新定义行业标…...

http

上一篇文章 初始化 MCP 环境 & 创建 MCP Server (一) 讲的是如何在 SSE 模式下启动 MCP Server。...

AI招聘机器人制造商Paradox.ai因弱密码泄露数百万求职者数据

安全研究人员发现AI招聘平台Paradox.ai因使用弱密码"123456"导致麦当劳等企业的6400万求职者信息泄露。调查还发现该公司越南开发者的设备感染信息窃取恶意软件,暴露出更多企业内部凭证和认证cookie。弱密码揭露AI招聘机器人制造商Paradox.ai的安全漏洞 安全研究人员…...

完整教程:【Leetcode hot 100】543.二叉树的直径

完整教程:【Leetcode hot 100】543.二叉树的直径pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace…...

Thundbird无法获取自签证书。

对于自建的邮件服务器,使用thundbird访问时,老版本会提示证书风险,但新版本没有提示,导致无法添加新的邮件账户。 方法(转自外网): 原文: In config editor, add network.security.ports.banned.override as a string with a value of "993" Then go to Mana…...

Gitee推出SBOM扫描功能:为开源供应链安全构筑数字防火墙

Gitee推出SBOM扫描功能:为开源供应链安全构筑"数字防火墙" 在开源软件占据现代软件开发90%以上组件的今天,供应链安全已成为行业不可忽视的挑战。Gitee最新推出的SBOM(软件物料清单)扫描功能,正在为开发者提供一套完整的开源组件风险管控方案,这标志着国内代码…...

mysql连表查询,轻松掌握多表数据关联技巧

做过数据库开发的朋友一定遇到过这样的困扰:数据分散在不同的表中,怎样才能一次查询获取完整的关联信息?比如你需要同时获取用户姓名和订单详情,或者既要产品信息又要供应商资料。这时候,连表查询就像一座连接数据孤岛的桥梁,让我们能够高效获取分散在各表中的相关联数据…...

Milvus集群部署

#本次部署其中的组件kafka、minio均为外置 将milvus chart包解压拷贝至某个目录下 编辑helm的values.yaml文件 ## Enable or disable Milvus Cluster mode cluster:enabled: trueimage:all:repository: milvusdb/milvustag: v2.4.1pullPolicy: IfNotPresent## Optionally speci…...

Qt-捕获摄像头画面

Qt-捕获摄像头画面在qt中捕获摄像头画面,在ui界面上添加一个comboBox控件、label标签和一个pushButton按钮,comboBox用于显示摄像头的设备,按钮用于开启摄像头,label用于显示摄像头捕获的画面。 //需要在.pro文件中加上multimedia multimediawidgets QT += core gui …...

选择MyEMS的十大核心优势:为您的企业开启智慧能管新纪元

在纷繁复杂的能源管理解决方案中,企业如何做出最明智的选择?如果您正在寻求一个既能立竿见影降本增效,又能为长期发展构建数字化基座的平台,那么MyEMS无疑是您的绝佳选择。它不仅是一款软件,更是一个强大的能源管理生态系统。以下是选择MyEMS的十大不可抗拒的优势。 一、极…...

通过 kubectl 插件 kubectl-tree 查看API对象层级关系

分享一个开源小工具 kubectl-tree,用于查看 k8s API 对象层级关系。 比如对于无状态应用来讲,可以看到Deployment --> ReplicaSet --> Pod 的构成关系。 采用二进制离线方式安装: 1、下载二进制安装包 wget https://github.com/ahmetb/kubectl-tree/releases/download…...

【Unity 性能优化之路——渲染流程(1)】 - 详解

【Unity 性能优化之路——渲染流程(1)】 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace…...

HCIA回顾——STP

...

.NET驾驭Word之力:COM组件二次开发全攻略之连接Word与创建你的第一个自动化文档

面向具有一定C#和.NET基础的开发者,本文将带你进入Word文档自动化处理的世界。通过本系列教程,你将掌握使用.NET操作Word文档的各种技巧,实现文档的自动化生成、处理和操作。引言 在日常开发中,我们经常需要处理Word文档,比如自动生成报告、批量处理文档、格式化文档内容等…...

last logicflow

<template><div class="logicflow-page"><div class="sidebar"><div class="palette-title">组件面板</div><div class="palette-item" @mousedown="startDrag(custom-rect, 矩形)">矩…...