首页 > 其他分享 >深度学习 - 稠密张量与稀疏张量的区别

深度学习 - 稠密张量与稀疏张量的区别

时间:2024-07-05 14:27:25浏览次数:16  
标签:存储 稠密 tensor 张量 稀疏 内存

稠密张量与稀疏张量的区别

在机器学习和数据处理领域,张量是处理和存储多维数据的核心结构。张量主要分为两类:稠密张量(Dense Tensor)和稀疏张量(Sparse Tensor)。它们在数据存储和计算效率方面有显著的区别。

稠密张量

定义
稠密张量是最常见的张量形式,每个元素都显式地存储在内存中,无论元素值是否为零。

优点

  • 访问和操作简单。
  • 适用于大多数常见的计算和机器学习任务。

缺点

  • 对于含有大量零元素的数据,存储效率低。
  • 计算效率可能受到大量零元素的影响。

内存使用
稠密张量的存储方式是将所有元素按顺序存储在内存中。对于一个 (m \times n) 的二维张量,内存使用量为 (m \times n \times \text{element size})(例如,每个浮点数元素通常占用4或8字节)。稠密张量的数据在内存中是连续的,这意味着可以利用缓存局部性、数据预取和矢量化操作等硬件优化功能。这在处理大规模数据时有助于提高访问速度。

例子

import numpy as np

# 创建一个1000x1000的稠密张量
dense_tensor = np.zeros((1000, 1000), dtype=np.float32)
dense_tensor[0, 0] = 1
dense_tensor[500, 500] = 2
dense_tensor[999, 999] = 3

print(dense_tensor.nbytes)  # 输出占用的内存大小

输出:

4000000  # 1000x1000x4 bytes = 4,000,000 bytes (约4 MB)
稀疏张量

定义
稀疏张量是为高效存储和计算稀疏数据而设计的张量类型。它只存储非零元素及其索引,从而节省了存储空间和提高计算效率。

优点

  • 存储效率高,对于大规模稀疏数据非常有效。
  • 提高计算效率,因为只处理非零元素。

缺点

  • 访问和操作可能比稠密张量复杂。
  • 目前支持的操作和函数比稠密张量少。

内存使用
稀疏张量只存储非零元素及其索引。以COO(坐标)格式为例,一个稀疏张量由三个部分组成:indices(表示非零元素的位置)、values(表示非零元素的值)和shape(表示张量的尺寸)。由于只存储非零元素,稀疏张量可以显著减少内存使用量,特别是在处理高度稀疏的数据时。然而,稀疏张量的数据在内存中通常是分散的,这可能影响缓存局部性和硬件优化的效果。

例子

import torch

# 创建一个1000x1000的稀疏张量
i = torch.tensor([[0, 500, 999], [0, 500, 999]])
v = torch.tensor([1, 2, 3], dtype=torch.float32)
sparse_tensor = torch.sparse_coo_tensor(i, v, (1000, 1000))

indices_memory = i.numel() * i.element_size()  # indices占用的内存
values_memory = v.numel() * v.element_size()  # values占用的内存
total_memory = indices_memory + values_memory

print(total_memory)  # 输出占用的内存大小

输出:

72  # (6*4 bytes for indices) + (3*4 bytes for values) = 24 + 12 = 36 bytes

在这个例子中,稀疏张量明显占用了更少的内存(72字节),相比于稠密张量的4,000,000字节。在实际应用中,稀疏张量在处理高度稀疏的数据时可以显著减少内存使用量。

内存相关效率

稠密张量的内存效率
  1. 缓存局部性
    稠密张量的数据是连续存储的,这利用了缓存局部性,使得访问速度更快。

  2. 矢量化操作
    由于数据在内存中的连续性,稠密张量可以利用SIMD(单指令多数据)指令进行矢量化操作,进一步提高计算效率。

  3. 内存预取
    现代CPU具有内存预取功能,可以提前加载将要访问的数据,这在处理稠密张量时特别有效。

稀疏张量的内存效率
  1. 减少内存使用
    对于高度稀疏的数据,稀疏张量显著减少了内存使用。这在处理大规模稀疏数据时尤为重要。

  2. 减少计算负担
    只对非零元素进行计算,避免了大量无意义的操作,特别是在矩阵运算中,可以显著提高效率。

  3. 分散存储
    数据在内存中的分散存储可能会影响缓存局部性,导致访问速度降低。为了提高效率,通常需要优化稀疏张量的存储格式和访问模式。

稠密张量与稀疏张量的转化

稠密张量转稀疏张量

稠密张量可以转化为稀疏张量,以节省存储空间和提高计算效率。常用的方法是提取非零元素及其索引。以下是使用 PyTorch 进行转化的示例:

import torch

# 创建一个稠密张量
dense_tensor = torch.tensor([[1, 0, 0],
                             [0, 2, 0],
                             [0, 0, 3]], dtype=torch.float32)

# 转化为稀疏张量
sparse_tensor = dense_tensor.to_sparse()

print(sparse_tensor)

输出:

tensor(indices=tensor([[0, 1, 2],
                       [0, 1, 2]]),
       values=tensor([1, 2, 3]),
       size=(3, 3), nnz=3, layout=torch.sparse_coo)
稀疏张量转稠密张量

稀疏张量可以转化为稠密张量,以便进行某些需要稠密表示的操作。以下是使用 PyTorch 进行转化的示例:

# 创建一个稀疏张量
i = torch.tensor([[0, 1, 2], [0, 1, 2]])
v = torch.tensor([1, 2, 3], dtype=torch.float32)
sparse_tensor = torch.sparse_coo_tensor(i, v, (3, 3))

# 转化为稠密张量
dense_tensor = sparse_tensor.to_dense()

print(dense_tensor)

输出:

tensor([[1., 0., 0.],
        [0., 2., 0.],
        [0., 0., 3.]])

总结表格

特性稠密张量(Dense Tensor)稀疏张量(Sparse Tensor)
定义存储所有元素,包括零元素仅存储非零元素及其索引
优点访问和操作简单,适用于大多数计算和机器学习任务存储效率高,对大规模稀疏数据有效,提高计算效率
缺点对于大量零元素的数据,存储效率低,计算效率可能低访问和操作复杂,目前支持的操作和函数较少
内存使用按顺序存储所有元素,内存使用量大只存储非零元素及其索引,内存使用量小
内存效率利用缓存局部性、数据预取和矢量化操作,访问速度快数据分散存储,可能影响缓存局部性,需要优化存储格式和访问模式
适用场景图像处理等数据密集型应用推荐系统、NLP等数据稀疏型应用
转化方法sparse_tensor.to_dense()dense_tensor.to_sparse()

实际应用中的选择

在实际应用中,选择稠密张量还是稀疏张量主要取决于数据的稀疏性和计算需求。例如:

  • 在自然语言处理(NLP)中,词向量矩阵通常是稀疏的,可以使用稀疏张量来提高存储和计算效率。
  • 在图像处理任务中,图像数据通常是稠密的,因此使用稠密张量更为合适。
  • 在推荐系统中,用户-物品评分矩阵通常是稀疏的,使用稀疏张量可以显著减少内存使用并提高计算效率。

通过理解稀疏张量和稠密张量在内存使用和效率方面的差异,可以更好地选择适合的张量类型来优化存储和计算性能。这将有助于在各种数据密集型和计算密集型任务中实现更高效的资源利用和更快的处理速度。

标签:存储,稠密,tensor,张量,稀疏,内存
From: https://blog.csdn.net/weixin_47552266/article/details/140134889

相关文章

  • 【大模型】大模型中的稀疏与稠密——一场效率与性能的较量
    大模型中的稀疏与稠密——一场效率与性能的较量深度解码:大模型中的稀疏与稠密——一场效率与性能的较量引言一、揭开面纱:何为稀疏与稠密?稠密模型:全连接的魅力稀疏模型:精简的力量二、深度对比:稀疏与稠密的较量计算效率模型性能资源消耗三、实际应用:选择的艺术四、未来趋......
  • 《昇思25天学习打卡营第2天 | 张量 Tensor》
    《昇思25天学习打卡营第2天|张量Tensor》《昇思25天学习打卡营第2天|张量Tensor》《昇思25天学习打卡营第2天|张量Tensor》什么是张量(Tensor)张量的创建方式根据数据直接生成从NumPy数组生成使用init初始化器构造张量继承另一个张量的属性,形成新的张量张量的属......
  • 【YOLOv8改进 - 注意力机制】NAM:基于归一化的注意力模块,将权重稀疏惩罚应用于注意力机
    YOLO目标检测创新改进与实战案例专栏专栏目录:YOLO有效改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLO基础解析+创新改进+实战案例摘要识别较不显著的特征是模型压缩的关键。然而,这在革命性的注意力机制......
  • M(q_i,K)稀疏测量值很小 是不是代表这个q不重要
    稀疏测量值很小并不一定直接意味着查询qiq_iqi​不重要。实际上,稀疏性测量值的解释可以更加复杂。让我们更深入地......
  • 编码器的稀疏注意力块(ProbSparse Self-Attention Block)
    编码器的稀疏注意力块(ProbSparseSelf-AttentionBlock)详细解释1.概述稀疏注意力块是Informer模型的核心组件之一,旨在高效处理长时间序列数据。它通过稀疏自注意力机制(ProbSparseSelf-Attention)显著降低计算复杂度,同时保持较高的性能。2.主要组件稀疏注意力块由以下......
  • 【MindSpore学习打卡】初学教程-03张量Tensor-理解MindSpore中的张量(Tensor)操作
    03张量Tensor-理解MindSpore中的张量(Tensor)操作在深度学习领域,张量(Tensor)是最基本的数据结构之一。它不仅可以表示标量、向量和矩阵,还可以表示更高维度的数据。张量在神经网络的构建和训练中扮演着至关重要的角色。在MindSpore中,张量是网络运算的基本单位。本篇博客将详......
  • ch11 特征选择与稀疏学习
    子集选择与评价缓解维度灾难的另一种重要方法是进行特征筛选,同时它也能降低学习任务的难度,只留下关键特征。对当前学习任务有用的属性称为“相关特征”,而对当前学习任务没有用的属性称为“无关特征”,包含信息能被其他特征表示的属性称为“冗余特征”。如果想要从原始特征集中选......
  • 深度学习--tensorflow中操作张量的高频率api--87
    目录1.创建张量2.shape操作3.数学运算4逻辑运算5.张量之间的操作6.数据类型的转换7.聚合(规约)操作8argmax1.创建张量tf.constant(value,dtype=None,shape=None,name='Const')tf.zeros(shape,dtype=tf.float32,name=None)tf.ones(shape,dtype=tf.float32,name......
  • 昇思25天学习打卡营第2天|张量、数据集和数据变换
    张量Tensor张量(Tensor)是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在......
  • 基于稀疏矩阵方法的剪枝压缩模型方案总结
    1.简介1.1目的在过去的一段时间里,对基于剪枝的模型压缩的算法进行了一系列的实现和实验,特别有引入的稀疏矩阵的方法实现了对模型大小的压缩,以及在部分环节中实现了模型前向算法的加速效果,但是总体上模型加速效果不理想。所以本文档针对这些实验结果进行分析和总结。1.2范围......