PyTorch中基础模块torch的详细介绍

torch 是 PyTorch 库的核心模块,提供了以下关键功能:

  1. 张量(Tensor):类似于 NumPy 的 ndarray,但可以无缝地在 CPU 或 GPU 上运行,并且支持自动微分,是深度学习模型中数据的主要表示形式。

  2. 数学运算:包括基本的数学运算符重载(如加减乘除)、矩阵运算(如矩阵乘法、点积、卷积)、统计函数(如求和、平均值、最大值、最小值等)以及更复杂的数学操作。

  3. 数据类型转换:允许用户创建不同数据类型的张量(例如 floatdoubleint8bool 等),并进行数据类型的相互转换。

  4. 随机数生成:提供了一系列方法用于生成符合不同分布(如均匀分布、正态分布、泊松分布等)的随机张量。

  5. 线性代数运算:包括矩阵分解(如 SVD、LU、QR 分解)、特征值与特征向量计算、矩阵逆、伪逆以及其他相关的线性代数操作。

  6. 自动微分:通过 autograd 子模块实现,允许张量上的操作自动生成梯度,为训练神经网络提供便利。

  7. 存储和序列化:支持将张量保存到磁盘以及从磁盘加载,同时还能序列化和反序列化整个模型结构及其参数。

  8. 多GPU支持:能够将计算任务分配到多个GPU上进行并行处理,提高计算效率。

  9. 神经网络层与优化器:虽然这些不是 torch 模块的一部分,但 PyTorch 中的 torch.nn 和 torch.optim 模块分别提供了构建和训练神经网络所需的层组件及优化算法。

1.  张量(Tensor)

在 PyTorch 中,张量(Tensor)是其核心数据结构之一,它类似于 NumPy 的 ndarray,但具备更多特性,尤其是支持 GPU 加速和自动微分。以下是 torch.Tensor 的详细介绍:

  1. 定义与创建

    • 张量可以表示多维数组,支持多种数据类型,包括浮点数、整数、布尔值等。
    • 创建张量的常见方法有:
       Python 
      1import torch
      2
      3# 直接从数据创建张量
      4x = torch.tensor([1, 2, 3])  # 一维张量
      5y = torch.tensor([[1, 2], [3, 4]])  # 二维张量
      6
      7# 根据现有张量或 Python 列表创建
      8z = torch.from_numpy(np.array([1, 2, 3]))  # 从 NumPy 数组创建
      9a = torch.zeros(3, 4)  # 创建全零张量
      10b = torch.ones_like(x)  # 创建与给定张量形状相同且元素为1的张量
      11c = torch.randn(5, 6)  # 创建服从正态分布的随机张量
      12
      13# 指定设备(CPU 或 GPU)
      14if torch.cuda.is_available():
      15    device = torch.device('cuda')
      16    d = torch.tensor([1, 2, 3], device=device)  # 创建在 GPU 上的张量
  2. 属性

    • 张量的维度可以通过 .shape 或 .size() 获取。
    • 数据类型可通过 .dtype 查看。
    • 存储位置(设备)通过 .device 获取。
  3. 操作

    • 张量支持丰富的数学运算,包括但不限于加法、减法、乘法、矩阵乘法、点积、求和、平均、最大值/最小值、指数、对数、索引访问、切片等。
    • 可以进行广播机制下的运算,类似 NumPy。
  4. 动态特性

    • PyTorch 张量具有动态形状,可以在运行时修改张量的大小和形状(例如使用 torch.view() 或 torch.reshape())。
  5. 自动微分

    • 当一个张量的 requires_grad 属性设置为 True 时,它会记录在其上的所有运算,形成一个计算图。调用 .backward() 方法时,会根据链式法则自动生成并累积梯度。
  6. 存储和序列化

    • 张量可以通过 torch.save() 和 torch.load() 进行持久化存储和加载。
    • 使用 torch.jit.script 或 torch.onnx.export 可将包含张量和运算的模型转换为可执行文件或ONNX格式,便于部署和跨平台使用。
  7. 与其他库集成

    • 与 NumPy 的无缝交互:可以直接将张量转换为 NumPy 数组,并反之亦然。

总之,torch.Tensor 是 PyTorch 库中的基石,提供了构建和训练深度学习模型所需的数据容器和高效计算环境。

2. 数学运算

在 PyTorch 中,torch 模块提供了丰富的数学运算功能,这些运算可以应用于 torch.Tensor 对象。以下是 torch 模块中部分关键的数学运算:

  1. 基本数学运算

    • 加法:a + b 或 torch.add(a, b)
    • 减法:a - b 或 torch.sub(a, b)
    • 乘法(元素级):a * b 或 torch.mul(a, b)
    • 除法(元素级):a / b 或 torch.div(a, b)
    • 幂运算(元素级):a ** b 或 torch.pow(a, b)
    • 点积(内积):对于向量 a 和 b,使用 torch.dot(a, b) 或 (a * b).sum(dim=-1)
    • 矩阵乘法:torch.mm(a, b) 或 torch.matmul(a, b) (支持广播和多维张量)
  2. 聚合操作

    • 求和:a.sum(dim=...) 计算指定维度上的和
    • 平均值:a.mean(dim=...)
    • 最大值和最小值:a.max(dim=...) 和 a.min(dim=...)
    • 标准差和方差:a.std(dim=...) 和 a.var(dim=...)
  3. 指数与对数运算

    • 自然指数:torch.exp(x)
    • 自然对数:torch.log(x)
    • 常用对数:torch.log10(x)
  4. 比较运算

    • 大于、小于、等于等比较操作符:a > ba < ba == b,返回的是布尔张量。
  5. 索引和切片

    • 类似 NumPy 的索引操作:a[indices]
    • 切片操作:a[:, start:end:step]
  6. 矩阵运算

    • 矩阵求逆:torch.inverse(matrix)
    • 矩阵转置:matrix.T 或者 torch.t(matrix)
    • QR 分解:torch.qr(matrix)
    • SVD 分解:torch.svd(matrix)
    • Cholesky 分解:torch.cholesky(matrix)
    • LU 分解:torch.lu(matrix)
  7. 随机数生成

    • 正态分布:torch.randn(size=(...))
    • 均匀分布:torch.rand(size=(...))
    • 其他分布:例如泊松分布 (torch.poisson(lamda, size=(...))) 和伯努利分布 (torch.bernoulli(probs, size=(...)))
  8. 线性代数运算

    • 行列式:torch.det(matrix)
    • 解线性系统:torch.solve(b, A)
    • 范数计算:torch.norm(tensor, p=None, dim=None, keepdim=False, out=None)

所有这些数学运算都支持自动微分,并且能够灵活地在 CPU 或 GPU 上运行。此外,如果涉及到的数据分布在多个设备上,还可以进行跨设备的运算。

3. 数据类型转换

在 PyTorch 中,数据类型转换是通过 torch.Tensor 类的方法或直接使用 torch.*Tensor 构造函数来实现的。以下是一些详细的数据类型转换方法:

  1. 通过构造函数转换: 当你创建一个新的张量时,可以通过指定其数据类型来完成转换。

     Python 
    1# 创建一个浮点型张量并转换为整型
    2float_tensor = torch.tensor([1.23, 4.56], dtype=torch.float32)
    3int_tensor = torch.tensor(float_tensor, dtype=torch.int32)
    4
    5# 直接创建特定类型张量
    6long_tensor = torch.tensor([1, 2, 3], dtype=torch.long)
  2. 通过 .to() 方法转换: 张量上的 .to() 方法可以用于改变现有张量的数据类型,并可以选择将其移动到不同的设备(如CPU或GPU)上。

     Python 
    1float_tensor = torch.tensor([1.0, 2.0])
    2int_tensor = float_tensor.to(torch.int32)  # 只改变数据类型
    3cuda_int_tensor = float_tensor.to(torch.device('cuda'), dtype=torch.int32)  # 改变设备和数据类型
  3. 使用 .type() 或 .astype() 方法

    • .type(new_type):将张量转换为新的数据类型。.type() 在旧版本中广泛使用,但在新版本中推荐使用 .to() 方法。
    • .astype(dtype, copy=True):与 NumPy 的接口类似,用于转换数据类型。此方法可能需要复制张量内容,取决于是否要求 copy 参数为 True
     Python 
    1float_tensor = torch.tensor([1.0, 2.0])
    2int_tensor = float_tensor.type(torch.int32)  # 老式用法
    3new_float_tensor = int_tensor.astype(torch.float32)  # 类似NumPy的接口,不过在PyTorch中不常用

常见的数据类型包括但不限于:

  • torch.float32 或 torch.float: 32位单精度浮点数
  • torch.float64 或 torch.double: 64位双精度浮点数
  • torch.int32 或 torch.int: 默认的32位有符号整数
  • torch.int64 或 torch.long: 通常用于索引操作的64位有符号整数
  • torch.uint8: 无符号8位整数,常用于存储像素值

转换时需要注意的是,从浮点数到整数类型的转换会进行截断(不是四舍五入),并且从低精度到高精度转换通常是安全的,但反之可能会导致精度损失。

4. 随机数生成

在PyTorch中,随机数生成是通过torch库提供的多种方法来实现的,这些方法允许用户根据不同的概率分布创建不同形状和数据类型的随机张量。以下是一些常用的PyTorch随机数生成函数:

  1. 均匀分布(Uniform Distribution):

    • torch.rand(*sizes, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) 该函数返回一个指定形状sizes的张量,其中元素是从[0, 1)区间内的均匀分布中抽取的。

    示例:

    Python
    1uniform_tensor = torch.rand(3, 4)
  2. 标准正态分布(Standard Normal Distribution):

    • torch.randn(*sizes, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) 这个函数返回一个形状为sizes的张量,其元素服从标准正态分布(均值为0,方差为1)。

    示例:

    Python
    1normal_tensor = torch.randn(5, 2)
  3. 离散分布(Discrete Distributions):

    • torch.randint(low, high, *sizes, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) 返回从lowhigh-1范围内的整数均匀分布中的随机数组成的张量。

    示例:

    Python
    1discrete_tensor = torch.randint(0, 10, (2, 3))
  4. 泊松分布(Poisson Distribution):

    • torch.poisson(lam=1, *size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) 生成形状为size的张量,其元素服从参数为lam的泊松分布。

    示例:

    Python
    1poisson_tensor = torch.poisson(torch.tensor([2.0, 3.0]), (2,))
  5. 随机排列(Random Permutation):

    • torch.randperm(n, out=None, dtype=torch.long, device=None) 返回一个大小为n的一维张量,其中包含从0到n-1之间的一个随机排列。

    示例:

    Python
    1permuted_indices = torch.randperm(10)
  6. 线性间距向量(Linearly-Spaced Vector):

    • torch.linspace(start, end, steps, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) 不是严格意义上的随机数生成函数,但它会创建一个从startend等间距的steps个数的张量。

    示例:

    Python
    1linspace_tensor = torch.linspace(0, 1, 5)
  7. 其它分布: PyTorch还支持更多复杂的概率分布,例如高斯分布、伯努利分布、指数分布等,可以通过torch.distributions模块来创建相应的分布对象并使用.sample()方法来生成随机数。

确保在进行随机实验时,能够控制随机种子以确保可复现性,可以使用 torch.manual_seed(seed) 或 torch.cuda.manual_seed_all(seed) 来设置全局随机种子。

5. 线性代数运算

在PyTorch中,线性代数运算被广泛应用于深度学习和数值计算中。以下是一些PyTorch模块提供的主要线性代数操作:

  1. 矩阵乘法

    • torch.matmul(a, b):进行矩阵乘法或向量-矩阵乘法(点积)。
    • torch.mm(a, b):用于2维张量的矩阵乘法,等同于matmul在特定场景下。
    • torch.bmm(a, b):进行两个3D张量的批量矩阵乘法,每个2D切片独立相乘。
  2. 点积、内积与范数

    • torch.dot(a, b):计算两个向量的点积(内积)。
    • a @ b:Python 3.5及更高版本中的矩阵乘法运算符,等价于torch.matmul(a, b)
    • torch.norm(input, p=2, dim=None, keepdim=False, out=None):计算张量的各个维度上的范数(默认为L2范数)。
  3. 转置和矩阵求逆

    • torch.t(input) 或 input.T:计算张量的转置。
    • torch.transpose(input, dim0, dim1):根据指定的维度交换输入张量的轴。
    • torch.inverse(A):计算方阵A的逆矩阵,返回一个与A形状相同的张量。
  4. 矩阵分解

    • torch.svd():奇异值分解(Singular Value Decomposition)。
    • torch.eig(eigenvectors=True):计算方阵的特征值和特征向量。
    • torch.linalg.qr(input, mode='reduced'):QR分解。
    • torch.lu(input, pivot=True):LU分解。
  5. 行列式与迹

    • torch.det(input):计算方阵的行列式。
    • torch.trace(input):计算对角线上元素之和,即矩阵的迹。
  6. 特征值与特征向量

    • torch.linalg.eigvals(A):只计算方阵A的特征值。
    • torch.linalg.eigvalsh(A):计算Hermitian矩阵A的特征值。
  7. 正交化与归一化

    • torch.nn.functional.normalize(input, p=2, dim, eps=1e-12, out=None):对张量进行长度规范化,使其成为单位向量。
  8. 标量与矩阵运算

    • torch.mul(a, b) 或 a * b:按元素逐个相乘。
    • torch.add(a, b) 或 a + b:按元素逐个相加。
    • 更多高级线性代数函数如矩阵求幂、解线性系统等可通过torch.linalg子模块实现。
  9. 广播规则下的数学运算: PyTorch支持NumPy风格的广播规则,在执行大多数线性代数运算时会自动应用这些规则来匹配不同大小的张量进行操作。

以上函数可以帮助用户在构建神经网络模型或者进行科学计算时方便地处理涉及线性代数的各种问题。

6. 存储和序列化

在PyTorch中,存储和序列化是模型部署、迁移学习以及持久保存训练结果的关键环节。以下是如何使用torch模块中的功能进行存储和序列化的详细介绍:

存储张量与模型参数

  1. 存储张量: 使用 torch.save() 函数可以将张量或任何可序列化的Python对象(如模型)保存到磁盘。

    Python
    1# 保存单个张量
    2torch.save(tensor, 'tensor.pt')
    3
    4# 保存字典或列表等复杂结构,其中包含张量
    5model_params = {'weights': weights_tensor, 'bias': bias_tensor}
    6torch.save(model_params, 'model_params.pt')
  2. 加载张量: 使用 torch.load() 函数从磁盘加载先前保存的张量或其他对象。

    Python
    1tensor = torch.load('tensor.pt')
    2model_params = torch.load('model_params.pt')

序列化模型

  1. 保存整个模型: 对于继承自 torch.nn.Module 的模型,可以直接保存整个模型及其状态(包括权重和优化器状态)。

    Python
    1torch.save(model.state_dict(), 'model.pth')  # 只保存模型参数
    2torch.save({'model_state_dict': model.state_dict(), 
    3            'optimizer_state_dict': optimizer.state_dict()}, 
    4           'model_and_optimizer.pth')  # 保存模型和优化器状态
  2. 加载模型: 加载时,需要创建一个与保存时相同架构的新模型实例,并使用 .load_state_dict() 方法恢复其参数。

    Python
    1model = MyModelClass()
    2model.load_state_dict(torch.load('model.pth'))
    3
    4# 如果还保存了优化器状态
    5optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
    6checkpoint = torch.load('model_and_optimizer.pth')
    7model.load_state_dict(checkpoint['model_state_dict'])
    8optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
  3. 脚本模式(Scripting)与 TorchScript

    • 要序列化模型为独立运行的脚本,可以使用 torch.jit.script() 或者 torch.jit.trace() 来编译模型到 TorchScript。
    • 编译后的模型可以通过 torch.jit.save() 和 torch.jit.load() 进行保存和加载,并且可以在不依赖 PyTorch 环境的情况下运行。
    Python
    1scripted_model = torch.jit.script(model)  # 或者 trace_module() for tracing
    2torch.jit.save(scripted_model, 'scripted_model.pt')
    3
    4loaded_scripted_model = torch.jit.load('scripted_model.pt')

通过上述方法,用户能够灵活地保存和加载模型参数,甚至可以将模型转换成独立执行文件,便于部署到没有安装完整 PyTorch 的环境或者移动端设备上。

7. 多GPU支持

       在PyTorch中,多GPU支持主要通过torch.nn.DataParalleltorch.nn.parallel.DistributedDataParallel两个模块实现。这两个模块都允许模型在多个GPU上并行执行,从而加速训练过程。

  1. torch.nn.DataParallel

    • nn.DataParallel 是一种简单且易于使用的多GPU并行机制,它将模型复制到所有可用的GPU设备上,并自动分配输入数据的不同部分到各个GPU进行前向传播计算。
    • 使用时,需要将模型包装在一个DataParallel实例内:
      Python
      1model = MyModel()
      2if torch.cuda.device_count() > 1:
      3    model = nn.DataParallel(model)
      4model.to(device)  # device可以是'cuda:0', 'cuda:1', etc.
    • 在后向传播过程中,梯度会在各个GPU间同步,然后更新主GPU上的模型参数。
  2. torch.nn.parallel.DistributedDataParallel (DDP)

    • DDP是一种更高级、更灵活也更高效的多GPU并行策略,适用于大规模分布式训练场景。

    • 它不仅支持单机多卡(multi-GPU),还支持多机多卡训练,在大型集群上实现高效的大规模深度学习模型训练。

    • 使用DPP需要初始化进程组、设置全局唯一的rank和world_size,并将模型封装进DistributedDataParallel

      Python
      1import torch.distributed as dist
      2from torch.nn.parallel import DistributedDataParallel as DDP
      3
      4os.environ['MASTER_ADDR'] = 'localhost'
      5os.environ['MASTER_PORT'] = '12355'
      6
      7rank = int(os.environ['RANK'])
      8world_size = int(os.environ['WORLD_SIZE'])
      9
      10dist.init_process_group(backend='nccl', init_method='env://', rank=rank, world_size=world_size)
      11
      12model = MyModel()
      13model = DDP(model, device_ids=[rank], output_device=rank)
    • DDP不仅会把模型参数分布在不同的GPU上,还会在每个GPU上维护模型的一份完整副本,这使得模型可以在每个GPU上独立地完成前向传播和反向传播,然后通过高效的通信库如NCCL来聚合梯度,最后在每个GPU上更新参数。

注意:使用多GPU并行时,要确保数据正确地分布在各个GPU之间。对于简单的数据并行处理,DataLoader可以通过设置num_workerspin_memory属性以优化CPU与GPU之间的数据传输。而对于DDP,通常会结合torch.utils.data.distributed.DistributedSampler来均衡地将数据分配到不同进程中。此外,还需考虑网络结构中的批次归一化层(BatchNorm)在多GPU训练时的特殊性,以及可能需要调整的学习率和其他超参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/674399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

帮写祝福、年味卡片,属于Mate X5 折叠屏手机的用户过年指南

怎样过一个舒心愉快的新年&#xff1f; 春运往返的漫漫旅途上&#xff0c;手机总是忠实陪伴我们打发那些无聊的时光——用Mate X5的悬停观影模式&#xff0c;相当于自带手机支架&#xff0c;解放你拿着零食的双手&#xff0c;旅途观影更快乐&#xff01; 同时&#xff0c;此模…

Linux(Ubuntu)环境下安装卸载Python3(避免踩坑)

一、安装 第一步&#xff1a; 进入/usr/local/目录&#xff0c;下载Python3&#xff0c;这里我下载的是python 3.8.10&#xff0c;如果要下载其他版本改下链接中的版本号&#xff0c;需与官网版本号对应。 wget https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tgz第…

Ubuntu安装SVN服务并结合内网穿透实现公网访问本地存储文件

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

重装系统---首次安装java的JDK

1、去官网或者百度资源选择自己想要下载的jdk版本即可 2、 3、按照步骤安装即可,路径不要更改,默认c盘安装就好,避免后面发生错误。 4、打开电脑的设置,编辑环境变量 这是添加之后的效果 5、再新建一个系统环境变量 6、编辑环境变量Path 添

appium抓包总结

appium抓包总结 背景&#xff1a;有些app通过抓包工具charles等抓不到接口数据&#xff0c;应为这一类抓包工具只能抓到应用层的数据包&#xff0c;而某些app的接口是走的传输层协议&#xff0c;所以此时只能通过AppIUM工具来进行抓包。 1、Appium 是什么&#xff1f; Appium…

【Flink状态管理(二)各状态初始化入口】状态初始化流程详解与源码剖析

文章目录 1. 状态初始化总流程梳理2.创建StreamOperatorStateContext3. StateInitializationContext的接口设计。4. 状态初始化举例&#xff1a;UDF状态初始化 在TaskManager中启动Task线程后&#xff0c;会调用StreamTask.invoke()方法触发当前Task中算子的执行&#xff0c;在…

Netty中解决粘包/半包

目录 什么是TCP粘包半包&#xff1f; TCP 粘包/半包发生的原因 解决粘包半包 channelRead和channelReadComplete区别 什么是TCP粘包半包&#xff1f; 假设客户端分别发送了两个数据包 D1 和 D2 给服务端&#xff0c;由于服务端一次读取到的字节数是不确定的&#xff0c;故可…

STM32——FLASH(1)简单介绍、分类、读写流程及注意事项

文章目录 FLASH的特点Nor flash和nand flashflash的读写flash 的存储单位 flash的读写过程 FLASH的特点 可擦写数据可修改可重写访问速度<ROM Nor flash和nand flash Nor flash 1、与SDRAM相似&#xff0c;用户可以直接运行装载到NORFLASH里面的代码&#xff0c;减少SRAM…

Zoho Mail企业邮箱商业扩展第3部分:计算财务状况

在Zoho Mail商业扩展系列的压轴篇章中&#xff0c;王雪琳利用Zoho Mail的集成功能成功地完成了各项工作&#xff0c;并顺利地建立了自己的营销代理机构。让我们快速回顾一下她的成功之路。 一、使用Zoho Mail成功方法概述 首先她通过Zoho Mail为其电子邮件地址设置了自定义域…

js实现LFU算法

LFU LFU算法是最近最少使用次数算法&#xff0c;针对的是使用次数&#xff1b; 补充一点&#xff1a;对于相同使用次数应该需要加上时间戳&#xff0c;看他人实现LFU算法都没有考虑这一点。 本文通过全局nextId来表示第几次使用功能&#xff1b; class LFU {constructor(capa…

spring boot打完jar包后使用命令行启动,提示xxx.jar 中没有主清单属性

在对springBoot接口中间件开发完毕后&#xff0c;本地启动没有任何问题&#xff0c;在使用package命令打包也没异常&#xff0c;打完包后使用命令行&#xff1a;java -jar xxx.jar启动发现报异常&#xff1a;xxx.jar 中没有主清单属性&#xff0c;具体解决方法如下&#xff1a;…

TI毫米波雷达开发——High Accuracy Demo 串口数据接收及TLV协议解析 matlab 源码

TI毫米波雷达开发——串口数据接收及TLV协议解析 matlab 源码 前置基础源代码功能说明功能演示视频文件结构01.bin / 02.binParseData.mread_file_and_plot_object_location.mread_serial_port_and_plot_object_location.m函数解析configureSport(comportSnum)readUartCallback…

day06.C++排序(整理)

一.直接插入排序 void Insertsort(int *a,int n){int i,j;for( i1;i<n;i){if(a[i]<a[i-1]){int tempa[i];//哨兵for( ji-1;temp<a[j];j--){a[j1]a[j];//记录后移}a[j1]temp;//插入到正确位置}} }二.希尔排序 void Shellsort(int *a,int n){for(int dltan/2;dlta>…

Linux增删ip

Linux手动增删IP by: 铁乐猫 日期&#xff1a;2022.03.17 这里主要是记录手动临时添加和删除ip。 ifconfig方式 例&#xff0c;添加&#xff1a; ifconfig eth0:1 192.168.0.101/24移除 ifconfig eth0:1 downip addr方式 添加 ip addr add 192.168.0.102/24 dev eth0 …

(2024 了,这文也太水了)审查 GAN 的 FID 和 SID 指标

Reviewing FID and SID Metrics on Generative Adversarial Networks 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 3. 方法 4. 实验 0. 摘要 生成对抗网络&…

深入理解Java泛型:概念、用法与优势

泛型是JDK的一个特性&#xff0c;它允许在定义类、接口和方法时使用类型参数。 例如泛型类&#xff1a;在定义类时&#xff0c;可以使用类型参数来指定类中某些字段或方法的类型 public class Box<T> { private T t; public void set(T t) { this.t t; } public T …

C++之多线程(multi-thread)

理论基础 多线程编程是C中一个重要而复杂的主题。下面是一些建议和步骤&#xff0c;帮助你入门多线程编程&#xff1a; 了解基础概念&#xff1a; 线程和进程&#xff1a; 理解线程和进程的基本概念。 并发和并行&#xff1a; 区分并发和并行的概念&#xff0c;了解它们在多线…

如何利用IP定位技术锁定网络攻击者

在当今高度互联的数字世界中&#xff0c;网络安全威胁日益猖獗。为了维护网络空间的安全与稳定&#xff0c;追踪并锁定网络攻击者成为了关键一环。而IP定位技术&#xff0c;作为一种重要的追踪手段&#xff0c;正发挥着越来越重要的作用。 IP定位技术&#xff0c;简而言之&…

Django模板(二)

标签if 标签在渲染过程中提供使用逻辑的方法,比如:if和for 标签被 {% 和 %} 包围,如下所示: 由于在模板中,没有办法通过代码缩进判断代码块,所以控制标签都需要有结束的标签 if判断标签{% if %} {% endif %} : # athlete_list 不为空 {% if athlete_list %}# 输出 ath…

vue实现购物车案例

话不多说&#xff0c;先上效果图。 安装elementui组件库&#xff0c;可直接食用。 <template><div><!-- 购物车部分 --><el-container><el-header><h1>购物车案例一条龙</h1></el-header><el-main><!-- 折叠面板…