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

张量与数据类型

Pytorch最基本的操作对象——张量(tensor),张量是Pytorch中重要的数据结构,可认为是一个高维数组。一般的,标量(scalar)是只有大小没有方向的量,如1、2、3等;向量(vector)是有大小和方向的量,如[1,2,3];矩阵(matrix)是由多个向量组成的,如[[1,2,3],[4,5,6]]。张量是基于向量和矩阵的推广,可以将标量视为零阶张量,向量可以视为一阶张量,矩阵是二阶张量。张量是支持高效的科学计算的数组,它可以是一个数(标量)、一维数组(向量)、二维数组(矩阵)和更高维的数组(高阶数据)。

1.1 PyTorch张量

PyTorch最基本的操作对象是张量,表示一个多维数组,张量类似NumPy的数组(ndarray),与ndarray不同的是,张量可以在GPU使用以加速计算。张量和NumPy的数组通常可以共享相同的低层内存,无须复制数据。
演示张量的创建和运算,首先导入PyTorch和NumPy,代码如下:

import torch
import numpy as np

1.1.1 初始化张量

可以使用多种形式初始化张量,如可直接从Python数据创建张量,无须指定类型,PyTorch会自动推荐其类型,可通过张量的dtype属性查看其类型。

t = torch.tensor([1, 2])      #创建一个张量     
print(t)                      #输出 tensor([1, 2])   
print(t.dtype)                #输出 torch.int64

代码输出:

tensor([1, 2])
torch.int64

在创建张量时,如果想直接创建为float类型,可使用torch.FloatTensor()方法;如果需要明确的创建为Int类型,可使用torch.LongTensor()方法。这两种类型是PyTorch中使用最多、最常见的两种类型。代码如下:

t = torch.FloatTensor([1, 2])
print(t)
print(t.dtype)

代码输出:

tensor([1., 2.])
torch.float32

======================= 代码分割线 =========================

t = torch.LongTensor([1, 2])
print(t)
print(t.dtype)

代码输出:

tensor([1, 2])
torch.int64

也可以使用torch.from_numpy()方法从NumPy数组ndarray张量。

np_array=np.array([[1,2],[3,4]])    #创建一个ndarray
t_np=torch.from_numpy(np_array)     #从ndarray创建张量
t_np

代码输出:

tensor([[1, 2],[3, 4]], dtype=torch.int32)

1.1.2 张量类型

PyTorch 张量的基础数据类型主要包含以下几种:

  1. torch.float32(或 torch.float):32 位浮动点数,最常用的数据类型,用于表示小数。
  2. torch.float64(或 torch.double):64 位浮动点数,用于需要更高精度的计算。
  3. torch.float16(或 torch.half):16 位浮动点数,常用于减少内存消耗和加速计算,尤其是在GPU上。
  4. torch.int8:8 位整数,用于表示整数值。
  5. torch.int16:16 位整数。
  6. torch.int32:32 位整数,常用整数类型。
  7. torch.int64(或 torch.long):64 位整数,通常用于较大的整数或索引。
  8. torch.uint8:8 位无符号整数,通常用于处理图像数据(如像素值)。
  9. torch.bool:布尔类型,值为 TrueFalse,用于逻辑运算。

不同数据类型适用于不同的任务和计算需求。在实际使用时,可以根据需求选择合适的张量数据类型,尤其是在性能和内存管理方面。
其中32位浮点型和64位整型是最常用的类型,这两种类型也常常被表示为torch.float和torch.long,也就是说,torch.float32等价于torch.float,torch.int64等价于torch.long,这两种类型正好对应上面的两种创建张量的方法torch.LongTensor()和torch.FloatTensor()。可在构造张量时使用dtype明确其类型。

t = torch.tensor([1,2], dtype=torch.float32)
print(t)
print(t.dtype)

代码输出:

tensor([1., 2.])
torch.float32

======================= 代码分割线 =========================

#也可以使用torch.float作为dtype的参数
t = torch.tensor([1,2], dtype=torch.float)
print(t)
print(t.dtype)

代码输出:

tensor([1., 2.])
torch.float32

======================= 代码分割线 =========================

print(torch.float==torch.float32)    #返回True
print(torch.long==torch.int64)       #返回True

代码输出:

True
True

以上代码中直接将torch.float与torch.float32做相等判断,判断后发现返回结果为True,说明这两个写法是完全等价的。PyTorch针对torch.float32与torch.int64类型有专门这样的简写形式是因为,这两种类型特别重要,模型的输入类型一般都是torch.float32,而模型分类问题的标签类型一般为torch.int64。
PyTorch中张量的类型可以使用type()方法转换,代码如下。

t = torch.tensor([1,2], dtype=torch.float32)
print(t.dtype)
#type()方法转换类型
t=t.type(torch.int64)
print(t.dtype)

代码输出:

torch.float32
torch.int64

编写代码过程中,由于转换为torch.float32和torh.int64两个类型最常见,框架提供了两个快捷的实例转换方法,即float()方法和long()方法。代码如下。

t = torch.tensor([1,2], dtype=torch.float32)
t=t.long()
print(t.dtype)
t=t.float()
print(t.dtype)

代码输出 :

torch.int64
torch.float32

1.1.3 创建随机值张量

可使用torch.rand()方法创建0~1均匀的随机数,使用torch.randn()方法创建标准正态分布随机数,使用torch.zeros()和torch.ones()方法创建全0和全1的张量,代码如下。

t = torch.rand(2, 3)
print(t)

代码输出:

tensor([[0.7330, 0.2682, 0.0917],[0.8569, 0.2710, 0.8089]])

======================= 代码分割线 =========================

t = torch.rand(2, 3)
print(t)

代码输出:

tensor([[0.5205, 0.9647, 0.5108],[0.7746, 0.4297, 0.5655]])

======================= 代码分割线 =========================

t = torch.zeros(3)
print(t)

代码输出:

tensor([0., 0., 0.])

======================= 代码分割线 =========================

t = torch.ones(3, 2)
print(t)

代码输出:

tensor([[1., 1.],[1., 1.],[1., 1.]])

还可以从另一个张量创建新的张量,除非明确覆盖,否则新的张量保留原来张量的属性(形状、数据类型),如下所示。

x = torch.zeros_like(t)      #类似的方法还有torch.ones_like()
print(x)

代码输出:

tensor([[0., 0.],[0., 0.],[0., 0.]])

======================= 代码分割线 =========================

x = torch.rand_like(t)     
print(x)

代码输出:

tensor([[0.2793, 0.3023],[0.5073, 0.3336],[0.7823, 0.4880]])

1.1.4 张量属性

tensor.shape属性可返回张量的形状,它与tensor.size()方法等价,后者更灵活,可以通过给定参数返回某一个维度的形状;tensor.dtype属性可返回当前张量的类型。代码如下。

t=torch.ones(2,3,dtype=torch.float64)
print(t.shape)         #输出torch.Size([2, 3])
print(t.size())        #输出torch.Size([2, 3])
print(t.size(1))       #输出第一维度大小 3   
print(t.dtype)         #输出torch.float64
print(t.device)        #输出cpu

代码输出:

torch.Size([2, 3])
torch.Size([2, 3])
3
torch.float64
cpu

可通过使用tensor.device属性查看当前张量所在的设备(device)。直接创建的张量都在内存中,所以显示的device是CPU,如果是显存中的张量,则显示为CUDA。

1.1.5 将张量移动到显存

张量可进行算术运算、线性代数、矩阵操作等计算,这些计算可以在CPU上运行,也可在GPU运行,在GPU上的运算速度通常高于CPU。默认情况下是在CPU创建张量。如果有可用的GPU,可以使用tensor.to()方法明确地将张量移动到GPU。代码如下。

#如果GPU可用,将张量移动到显存
if torch.cuda.is_available():t = t.to('cuda')
print(t.device)          #如果GPU可用,输出类似device(type='cuda',index=0)

代码输出:

cpu

在编码过程中,一般可用如下代码获取当前可用设备。

#获取当前可用设备
device="cuda" if torch.cuda.is_available() else "cpu"
print("Using {} device".format(device))     #打印当前可用设备
t=t.to(device)                              #将t放到当前可用设备上
print(t.device)                             #如果GPU可用,输出类似device(type='cuda',index=0)

代码输出:

Using cpu device
cpu

这样设置要比直接使用t.to(‘cuda’)更稳妥,可以确保代码中无论有无GPU都能正常运行,并且如果GPU可用就用GPU.

1.2 张量运算

张量的运算规则、切片索引规则与NumPy类似,运算中遵循广播原则和同形状相同位置元素对方运算的原则,代码如下。

t1 = torch.randn(2, 3)
t2 = torch.ones(2, 3)
print(t1 + 3)           #t1中每一个元素都加3
print(t1 + t2)          #t1与t2中每一个相同位置的元素相加
print(t1.add(t2))       #等价于t1+t2,结果与上面相同print(t1)               #输出当前t1值
t1.add_(t2)             #运行add_这个计算方法,add_方法中的下划线代表就地改变原值
print(t1)               #查看运行结果

代码输出:

tensor([[2.8404, 2.7435, 4.1129],[2.7789, 4.4589, 4.5274]])
tensor([[0.8404, 0.7435, 2.1129],[0.7789, 2.4589, 2.5274]])
tensor([[0.8404, 0.7435, 2.1129],[0.7789, 2.4589, 2.5274]])
tensor([[-0.1596, -0.2565,  1.1129],[-0.2211,  1.4589,  1.5274]])
tensor([[0.8404, 0.7435, 2.1129],[0.7789, 2.4589, 2.5274]])

在PyTorch中,如果一个运算方法后面加上下画线,代表就地改变原值,即t1.add_(t2)会直接将运算结果保存为t1,这样做可以节省内存,但是缺点是会直接改变t1原值,因为在使用的时候需要谨慎。
张量可以进行常见的算术运算,如abs(绝对值)、cunsum(累加)、divide(除)、floor_divide(整除)、mean(均值)、min(最小值)、max(最大值)、multiply(乘)等,这里不再一一演示。在深度学习中,矩阵运算常用到转置(tensor.T)和矩阵乘法(matmul或@),代码如下。

print(t1.matmul(t2.T))     #t1与t2的转置进行矩阵乘法
print(t1@(t2.T))           #与上一行运行等价,t1与t2的转置进行矩阵乘法  

代码输出:

tensor([[3.6968, 3.6968],[5.7652, 5.7652]])
tensor([[3.6968, 3.6968],[5.7652, 5.7652]])

对于只有一个元素的张量,可以使用tensor.item()方法将其转换为标量,也就是Python的基本类型。

t3 = t1.sum()
print(t3)              #t3是只有一个元素的张量
print(t3.item())       #输出一个Python浮点数 

代码输出:

tensor(9.4620)
9.461990356445312

以上代码中,首先将张量中所有的元素求和,得到只有一个元素的张量,然后使用tensor.item()方法将其转为标量,这种转换在我们希望打印模型正确率和损失值的时候很常见。

1.2.1 与NumPy数据类型的转换

1.1.1节演示了可使用torch.from_numpy()方法将ndarray转为张量,张量也可以使用tensor.numpy()方法得到它对应的ndarray数组,它们共用相同的内存。

### 与ndarray数据类型的转换import numpy as np
a = np.random.randn(2, 3)    #创建一个形状为(2,3)的ndarray
print(a)                     #输出此ndarray
t = torch.from_numpy(a)      #使用此ndarray创建一个张量
print(t)                     
print(t.numpy())             #使用tensor.numpy()方法获得张量对应的ndarray

代码输出:

[[ 0.22605693  0.04398624 -0.21096077][-0.66368309  1.23512604  2.0399825 ]]
tensor([[ 0.2261,  0.0440, -0.2110],[-0.6637,  1.2351,  2.0400]], dtype=torch.float64)
[[ 0.22605693  0.04398624 -0.21096077][-0.66368309  1.23512604  2.0399825 ]]

1.2.2 张量的变形

tensor.size()方法和tensor.shape属性可以返回张量的形状。当需要改变张量的形状时,可以通过tensor.view()方法,这个方法相当于NunPy中的reshape方法,用于改变张量的形状。需要注意的是,在转换过程要确保元素数量一致。代码如下。

t=torch.randn(4,6)    #创建一个形状为(4,6)的张量
print(t.shape)        #输出t的形状为torch.Size([4, 6])
t1=t.view(3,8)        #调整成(3,8)形状,这里元素数量是相等的
print(t1.shape)       #输出t1的形状为torch.Size([3, 8])

代码输出:

torch.Size([4, 6])
torch.Size([3, 8])

======================= 代码分割线 =========================

#现在我们需要将t展平为最后一个维度为1的张量
#第二个参数1代表第二维长度为1,参数-1表示根据元素个数自动计算第一维
t1=t.view(-1,1)
print(t1.shape)

代码输出:

torch.Size([24, 1])

======================= 代码分割线 =========================

# 也可以使用view增加维度,当然元素个数是不变的
t1=t.view(1,4,6)       #调整成三维的,其中第一维的长度为1
print(t1.shape)

代码输出:

torch.Size([1, 4, 6])

对于维度长度为1的张量,可以使用torch.squeeze()方法去掉长度为1的维度,相应的也有一 个增加长度为1维度的方法,即torch.unsqueeze(),代码如下。

t2=torch.squeeze(t1)
print(t2.shape)

代码输出:

torch.Size([4, 6])

======================= 代码分割线 =========================

t3=torch.unsqueeze(t2,0)     #参数0表示指定在第一个维度上增加维度
print(t3.shape)

代码输出:

torch.Size([1, 4, 6])

1.3 张量的自动微分

在PyTorch中,张量有一个requires_grad属性,可以在创建张量时指定些属性为True。如果requires_grad属性被设置为True,PyTorch将开始跟踪对此张量的所有计算,完成计算后,可以对计算结果调用backward() 方法,PyTorch将自动计算所有梯度。该张量的梯度将累加到.grad属性中。张量的grad_fn属性则指向运算生成此张量的方法。简单的说,张量的requires_grad属性用来明确是否跟踪张量的梯度,grad属性表示计算得到的梯度,grad_fn属性表示运算得到生成此张量的方法。代码演示如下。注意查看代码中的注释。

t = torch.ones(2, 2, requires_grad=True)    # 这里设置 requires_grad 为True
print(t.requires_grad)                      # 输出 True
print(t.grad)               # tensor.grad输出张量的梯度,这里输出 None,因为目前 t 没有梯度
print(t.grad_fn)            # tensor.grad_fn指向运算生成此张量的方法,这里为 None# 进行张量运算,得到 y
y = t + 5
print(y)           # 输出 tensor([[6., 6.],[6., 6.]], grad_fn=<AddBackward0>)
# y由于是运算而创建的,因此grad_fn属性不是空
print(y.grad_fn)   # 输出类似<AddBackward0 object at 0x00000237DF1A4250># 进行更多运算
z = y * 2
out = z.mean()     #求张量的均值,实例方法
print(out)         # 输出 tensor(12., grad_fn=<MeanBackward0>)

代码输出:

True
None
None
tensor([[6., 6.],[6., 6.]], grad_fn=<AddBackward0>)
<AddBackward0 object at 0x000001B460445750>
tensor(12., grad_fn=<MeanBackward0>)

上面的代码中,首先创建了张量,并指定requires_grad属性为True,因为这是一个新创建的张量,它的grad和grad_fn属性均为空。然后经过加法、乘法和取均值运算,得到了out这个最终结果。注意:现在out只有单个元素,它是一个标量值。下面在out上执行自动微分运算,并输出t的梯度(d(out)/d(x)微分运算的结果),代码如下。

out.backward()    # 自动微分运算, 注意 out 是标量值
print(t.grad)     #输出t的梯度,也就是d(out)/d(x)微分运算的结果

代码输出:

tensor([[0.5000, 0.5000],[0.5000, 0.5000]])

当张量的 requires_grad 属性为 True 时,PyTorch会一直跟踪记录此张量的运算;

print(t.requires_grad)           # 输出 True ,PyTorch框架会跟踪此张量的运算
s = t + 2                        # 进行运算,得到新的张量 s
print(s.requires_grad)           # 输出 True ,PyTorch框架会继续跟踪此张量的运算

代码输出:

True
True

也可使用 tensor.detach() 来获得具有相同内容但不需要跟踪运算的新张量,可以认为获取张量的值,代码如下。

print(out.requires_grad)     # 输出 True
s = out.detach()             # 获取out的值,也可以使用out.data()方法
print(s.requires_grad)       # 输出 False

代码输出:

True
False

可以使用 requires_grad_() 就地改变张量的这个属性,当我们希望模型的参数不再随着训练变化时,可以用此方法,代码如下:

print(t.requires_grad)      # 输出 True
t.requires_grad_(False)     # 就地改变requires_grad为False
print(t.requires_grad)      # 输出 False

代码输出:

True
False

1.4 小结

讲解了张量的创建、PyTorch数据类型、张量运算、张量自动微分等基础知识,这是PyTorch中比较基础的内容。

相关文章:

张量与数据类型

Pytorch最基本的操作对象——张量&#xff08;tensor&#xff09;&#xff0c;张量是Pytorch中重要的数据结构&#xff0c;可认为是一个高维数组。一般的&#xff0c;标量&#xff08;scalar&#xff09;是只有大小没有方向的量&#xff0c;如1、2、3等&#xff1b;向量&#x…...

JavaScript概述

Web网页的三要素&#xff1a;HTML结构、CSS表现、JavaScript行为。 一、JavaScript语言的组成 JS的全称叫JavaScript&#xff0c;它一门面向对象的解释型弱类型语言。 JavaScript也是由3个部分来组成的&#xff1a;ECMAScript、DOM、BOM。 ECMAScript——它是JS的核心部分&a…...

tarjan算法——割边

今天也是小小的学了一个tarjan算法中的割边的一个应用 他和割点很像&#xff0c;都是用来处理无向图的&#xff0c;只不过是不能走反向边罢了 我们首先来说一个割边的定义 割边 当我们在无向图中删除一个边&#xff0c;无向图被分成不联通的两部分&#xff0c;那么这条边就…...

ESP32 I2S音频总线学习笔记(一):初识I2S通信与配置基础

文章目录 简介为什么需要I2S&#xff1f;关于音频信号采样率分辨率音频声道 怎样使用I2S传输音频&#xff1f;位时钟BCLK字时钟WS串行数据SD I2S传输模型I2S通信格式I2S格式左对齐格式右对齐格式 i2s基本配置i2s 底层API加载I2S驱动设置I2S使用的引脚I2S读取数据I2S发送数据卸载…...

Mybatisplus-IService

IService 是 MyBatis-Plus 提供的一个通用 Service 层接口&#xff0c;它封装了常见的 CRUD 操作&#xff0c;包括插入、删除、查询和分页等。通过继承 IService 接口&#xff0c;可以快速实现对数据库的基本操作&#xff0c;同时保持代码的简洁性和可维护性。 IService 接口中…...

深入浅出 Beam Search:自然语言处理中的高效搜索利器

Beam Search 技术详解 1. 引言 Beam Search 是一种广泛应用于自然语言处理&#xff08;NLP&#xff09;、机器翻译、语音识别等序列生成任务中的启发式搜索方法。本文将详细探讨 Beam Search 的原理、实现步骤、应用场景及其优缺点&#xff0c;并通过具体例子帮助读者更好地理…...

MySQL 可重复读隔离级别,完全解决幻读了吗?

什么是事务隔离级别&#xff1f; 事务隔离级别是数据库用来控制多个并发事务之间如何交互的机制。不同的隔离级别提供了不同程度的保护&#xff0c;以防止并发事务之间的相互干扰。MySQL 支持四种隔离级别&#xff1a; 读未提交&#xff08;Read Uncommitted&#xff09;&…...

Nginx知识详解(理论+实战更易懂)

目录 一、Nginx架构和安装 1.1 Nginx 概述 1.1.1 nginx介绍 1.1.2?Nginx 功能介绍 1.1.3?基础特性 1.1.4?Web 服务相关的功能 1.2?Nginx 架构和进程 1.2.1?Nginx 进程结构 1.2.2?Nginx 进程间通信 1.2.3?Nginx 启动和 HTTP 连接建立 1.2.4?HTTP 处理过程 1…...

VScode怎么重启

原文链接&#xff1a;【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行&#xff0c;如下图&#xff1a; 输入Reload Window&#xff0c;如下图&#xff1a;...

华夏ERP系统部署

JDK安装及环境变量配置 数据库安装 Redis安装部署 Nginx安装部署 后端程序前端程序部署...

实际部署Dify可能遇到的问题:忘记密码、开启HTTPS、知识库文档上传的大小限制和数量限制

背景 前面我们以 docker compose 容器化的方式本地部署了 Dify 社区版&#xff0c;并快速体验了其聊天助手、工作量编排以及智能体&#xff08;Agent&#xff09;功能。不过后续实际生产环境使用时遇到了忘记密码、如何开启SSL以支持HTTPS、如何突破知识库文档上传的大小限制和…...

【C语言】库函数常见的陷阱与缺陷(三):内存分配函数[4]--free

C语言中的free函数用于释放之前通过malloc、calloc或realloc动态分配的内存。然而,在使用free函数时,开发者可能会遇到一些陷阱和缺陷。 一、功能与用法 free 函数是 C 语言中用于释放动态分配内存的关键函数。在程序使用 malloc、calloc 或 realloc 等函数在堆上分配了内存…...

【TypeScript篇】TypeScript命令行编译和自动化编译

目录 1. 命令行编译 步骤一&#xff1a;创建一个demo.ts文件 步骤二&#xff1a;全局安装TypeScript 步骤三&#xff1a;使用命令编译.ts文件 2. 自动化编译 步骤一&#xff1a;生成编译控制文件 步骤二&#xff1a;开启监视 3. 自动化编译的一些其它问题 1. 命令行编译…...

电子应用设计方案78:智能窗户系统设计

智能窗户系统设计 一、引言 智能窗户系统旨在为用户提供更便捷、舒适和节能的窗户控制体验&#xff0c;同时增强家居的安全性和智能化程度。 二、系统概述 1. 系统目标 - 实现窗户的自动开关控制&#xff0c;根据环境条件和用户设定进行操作。 - 具备风雨感应功能&#xff0c…...

数据挖掘笔记 | 插值 | 拉格朗日插值 | 龙格现象 | 埃尔米特插值 | 分段三次埃尔米特插值

Interpolation插值 ​ 对于缺失值的处理&#xff0c;比较常见的是数值分析中的插值和拟合这两种方法。插值指的是在离散数据的基础上补插连续函数&#xff0c;使得这条连续曲线通过全部给定的离散数据点&#xff1b;拟合则是找到一条“最优”的曲线&#xff0c;尽可能地贴近平…...

Ubuntu网络配置(桥接模式, nat模式, host主机模式)

windows上安装了vmware虚拟机&#xff0c; vmware虚拟机上运行着ubuntu系统。windows与虚拟机可以通过三种方式进行通信。分别是桥接模式&#xff1b;nat模式&#xff1b;host模式 一、桥接模式 所谓桥接模式&#xff0c;也就是虚拟机与宿主机处于同一个网段&#xff0c; 宿主机…...

【Linux网络编程】第十七弹---深入理解以太网与ARP协议:从帧格式到数据报解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、认识以太网 1.1、以太网帧格式 1.2、认识 MAC 地址 1.3、对比理解 MAC 地址和 IP 地址 1.4、认识 MT…...

AVL 树

1.AVL树的概念 AVL树是最先发明的自平衡二叉查找树&#xff0c;AVL树可以是一棵空树&#xff0c;或者具有以下性质的树&#xff1a;左右子树都是AVL树。且左右子树的高度差的绝对值不超过1。 AVL树是一颗高度平衡搜索二叉树&#xff0c;通过控制高度去控制平衡。 AVL树的发明…...

PHP关键字Self、Static和parent的区别

简介 在使用PHP代码时&#xff0c;您可能经常会遇到parent::、static::和self::。但是当你第一次作为一个开发人员开始的时候&#xff0c;有时候你会很困惑&#xff0c;不知道它们是做什么的&#xff0c;以及它们之间的区别。 在我第一次作为开发人员开始工作后的很长一段时间…...

Vscode左大括号不另起一行、注释自动换行

参考大佬的博客VSCode 格式化 cpp 文件时配置左大括号不换行_vscode大括号不换行-CSDN博客 Clang_format_style {BasedOnStyle: Chromium, IndentWidth: 4}...

golang标准库archive/tar实现打包压缩及解压

文章目录 前言一、单个文件操作1.单个文件打包示例2.单个文件解包示例 二、目录示例1.打包压缩2.解包 补充 前言 这个包就是将文件进行打包和解包&#xff0c;通俗理解就是Linux 下的 tar 命令。 主要是通过 tar.Reader 读取 tar 包&#xff0c;通过 tar.Writer 写入 tar包&am…...

模方匀色功能中,加载的模板文件从哪里来

使用 DasViewerV3.1.2及以上版本导出的颜色调整文件 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.2新增内置“自动UV展开”功能&#xff0c;新增局部调色功能和DOM匀色功能等。同时可与…...

maya 删除 Ctrl + Delete vs Delete

在 Autodesk Maya 中删除选定顶点的步骤&#xff1a; 1. 选择顶点&#xff1a; 进入顶点选择模式&#xff1a; 按 F9 键&#xff08;切换到顶点选择模式&#xff09;。 或者&#xff0c;在工具栏中点击顶点选择图标&#xff08;顶点模式&#xff09;。 在视图中选择您想要删…...

为何String不可变,String的运算符重载

1.为何String不可变 java9之前&#xff0c;String的源码中是用字符数组实现的&#xff0c;同时使用了final和private修饰&#xff0c;被final修饰的结果就是变量不可修改、类不可继承、方法不可重写&#xff0c;被private修饰就无法对外暴露&#xff0c;这就是为何String不可变…...

WebRTC :原理、协议和应用场景

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种用于在Web浏览器和移动应用程序之间进行实时通信的开放标准。它通过将音频、视频和数据传输集成到Web浏览器中&#xff0c;使得实时通信变得简单且无需任何插件或第三方软件。 一、WebRTC 的原理 WebRTC的实…...

Windows FTP服务器搭建指南

在Windows上搭建FTP服务器可以通过以下步骤完成。这里以Windows 10为例&#xff0c;使用系统自带的IIS&#xff08;Internet Information Services&#xff09;来搭建FTP服务器。 步骤1&#xff1a;安装IIS和FTP服务器组件 打开“控制面板”&#xff1a; 按 Win R&#xff0c…...

DP协议:Link层(二)

书接上文,内容多了难免会有一种知识点零碎感,但是坚持学下去,有一天你会发现已经不知不觉可以链接成一张知识网络了。 AUX提供的services 前面咱刚刚简单的认识了AUX CH的状态和仲裁,这次咱们接着聊聊AUX提供的services。 管理连接和设备:AUX CH就像是一个管家,负责找到…...

HAL 库 HAL_UARTEx_ReceiveToIdle_IT 函数解析

一、存在位置&#xff1a;stm32f1xx_hal_uart.c 二、具体代码 二、返回值&#xff1a;HAL_StatusTypeDef 通过查看返回值HAL_StatusTypeDef在stm32f1xx_hal_edf.h文件中定义为结构体类型。 status&#xff1a;&#xff08;进展的&#xff09;状况&#xff0c;情形 三、函数名…...

C++ 设计模式:职责链模式(Chain of Responsibility)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 组合模式 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合。这些对象通过…...

数据库约束和查询

一 约束意义 这个后面的字段是什么意思呢? 先前说数据类型是一种约束&#xff0c;约束我们只能放该类型的数据&#xff0c;还有其它的约束来保证数据的合法性&#xff0c;下面的字段就和约束有关。 编译器的编译就是一个约束&#xff0c;保证我们的代码一定是语法合格的。我们…...

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(二)

****非斜体正文为原文献内容&#xff08;也包含笔者的补充&#xff09;&#xff0c;灰色块中是对文章细节的进一步详细解释&#xff01; 3.1.2 基于注意力的解释&#xff08;Attention-Based Explanation&#xff09; 注意力机制可以揭示输入数据中各个部分之间的关系&#…...

AI大模型-提示工程学笔记1

卷首语&#xff1a;我所知的是我自己非常无知&#xff0c;所以我要不断学习。 写给AI入行比较晚的小白们&#xff08;比如我自己&#xff09;看的&#xff0c;大神可以直接路过无视了。 几个基本概念 1. 给LLM提示 用户可以通过简单的提示词&#xff08;Prompts&#xff09…...

webrtc-internals调试工具

Google 的 Chrome&#xff08;87 或更高版本&#xff09;WebRTC 内部工具是一套内置于 Chrome 浏览器中的调试工具; webrtc-internals 能够查看有关视频和音频轨道、使用的编解码器以及流的一般质量的详细信息。这些知识对于解决音频和视频质量差的问题非常有帮助。 webrtc-int…...

百度PaddleSpeech识别大音频文件报错

一、背景 公司前同事留下了一套语音识别项目&#xff0c;内部使用百度PaddleSpeech。在项目验收的时候发现无法识别大音频文件&#xff0c;但是可以识别小音频文件。 这套项目是通过python调用的百度PaddleSpeech&#xff0c;然后提供了restful接口&#xff0c;然后java项目可…...

No.3十六届蓝桥杯备战|数据类型长度|sizeof|typedef|练习(C++)

数据类型⻓度 每⼀种数据类型都有⾃⼰的⻓度&#xff0c;使⽤不同的数据类型&#xff0c;能够创建出⻓度不同的变量&#xff0c;变量⻓度的不同&#xff0c;存储的数据范围就有所差异。 sizeof操作符 sizeof 是⼀个关键字&#xff0c;也是操作符&#xff0c;专⻔是⽤来计算特…...

MapReduce相关概念(自用)

MapReduce&#xff1a;分布式计算模型 MapReduce 是一种分布式计算模型&#xff0c;由 Google 在 2004 年提出&#xff0c;用于大规模数据集&#xff08;TB 或 PB 级别&#xff09;的分布式处理。它通过简单的编程模型&#xff0c;将复杂的分布式计算分解为两个基本阶段&#…...

Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)

文章目录 概述步骤 1: 安装 Nginx 和 Lua 模块步骤 2: 创建 Lua 脚本用于参数校验步骤 3: 配置 Nginx 使用 Lua 脚本写法二&#xff1a; 状态码写法三 &#xff1a; 返回自定义JSON复杂的正则校验 步骤 4: 测试和验证ngx.HTTP_* 枚举值 概述 一个不使用 OpenResty 的 Nginx 集…...

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据

存储器模式&#xff1a;在HAL库中&#xff0c;I2C有专门对存储器外设设置的库函数 I2C&#xff08;一&#xff09;&#xff1a;存储器模式的使用 1、I2C轮询式写读AT24C02一页数据2、I2C轮询式写读AT24C02多页数据3、I2C中断式写读AT24C02一页数据4、I2C使用DMA式写读AT24C02一…...

AI助手网站

​​​​​​​ chatgpt &#xff1a;https://chatgpt.com/ https://openai.com/index/chatgpt/ 百度ai助手 https://chat.baidu.com/ 百度AI助手https://chat.baidu.com/ 文心快码 文心快码BaiduComate 文心快码BaiduComate 文心快码BaiduComate有代码问题&#xff0c;问文…...

初始nginx

华子目录 nginx介绍nginx功能介绍基础特性web服务相关功能nginx进程结构web请求处理机制 nginx进程间通信nginx启动与http连接建立http处理过程 nginx模块介绍nginx命令演示 nginx介绍 nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服…...

可扩展性设计架构模式——事件驱动架构

事件驱动架构&#xff08;Event-Driven Architecture, EDA&#xff09;是一种可扩展性设计软件架构模式&#xff0c;它通过事件来触发和通信&#xff08;以事件为核心&#xff09;&#xff0c;实现不同系统组件之间的解耦&#xff08;促进应用程序或系统部件之间的松耦合通信&a…...

Prometheus 专栏 —— Prometheus安装、配置

配置文件基本结构 global: 全局配置 scrape_interval: 抓取目标指标的频率&#xff0c;默认为 1minevaluation_interval: 评估告警规则的频率&#xff0c;默认为 1minscrape_timeout: 抓取目标指标数据拉取超时&#xff0c;默认为 10s&#xff0c;如果出现 context deadline e…...

Java并发编程面试题:线程池Fork/Join(19题)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

【每日学点鸿蒙知识】WebView代理、2D绘制矩形圆角、TextInput清理按钮、pdf滑动、icon配置问题

1、HarmonyOS Webview 支持设置代理功能吗&#xff1f; 使用Web的onInterceptRequest先拦截再代理来实现。具体可以参考文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-basic-components-web-V5#ZH-CN_TOPIC_0000001930757269__on…...

抽奖系统(1)(Java 实现)

1. 需求描述 1. 包含管理员的注册与登录 1) 注册包含&#xff1a;姓名、邮箱、手机号、密码 2) 登录包含两种方式 (1) 电话 密码登录 (2) 电话 短信登录&#xff1b;验证码获取 (3) 登录需要校验管理员身份 2. 人员管理&#xff1a;管理员支持创建普通用户&#xff0c;查看…...

数据库系统原理复习汇总

数据库系统原理复习汇总 一、数据库系统原理重点内容提纲 题型&#xff1a;主观题 1、简答题 第一章&#xff1a;数据库的基本概念&#xff1a;数据库、数据库管理系统、三级模式&#xff1b;两级映像、外码 第二章&#xff1a;什么是自然连接、等值连接&#xff1b; 第三…...

基于16QAM的载波同步和定时同步性能仿真,采用四倍采样,包括Costas环和gardner环

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 载波同步是…...

鸿蒙next RCP网络请求工具类进阶版来了

前言&#xff1a; 各位同学大家好&#xff0c;有一段时间没有更新文章了,最近因为鸿蒙官方的网络请求换掉了了rcp 之前是使用http 这些都是原生开发的 当然有那种三方大家熟知的 axios (这个也是基于http 后面也会过时)所以大家还是要了解一下rcp的原生的网络请求的。那么我们…...

driftingblues6_vh靶机

首先把靶机换成NAT模式 使用 arp-scan 命令扫描网段内存活的主机&#xff0c;以获取靶机ip地址 arp-scn -l 尝试访问ip 使用御剑扫描子域名&#xff0c;尝试访问robots.txt文件 通过访问文件我们发现了一个/textpattern/textpattern目录 访问一下目录发现了登录页面 他还给了…...

Go语言入门

文章目录 零、Linux下Go的安装1.下载、解压2.添加环境变量3.验证安装4.初始化Go模块(1)cd到项目目录(2)初始化模块(3)获取依赖包(4)清理和验证依赖(5)检查 go.mod 文件(6)介绍 go.mod 和 go.sum 文件 5.项目目录结构 一、感性认识1.从 Hello world 开始2.加法函数 二、Go语法1.…...