PyTorch torch稀疏

2025-07-02 11:33 更新

PyTorch 稀疏张量详解:从基础到应用

一、稀疏张量是什么?

稀疏张量是指那些包含大量零值的张量。在处理高维数据或大规模模型时,稀疏张量能够显著节省内存和计算资源。PyTorch 支持 COO(Coordinate Format)格式的稀疏张量,这种格式通过两个密集张量来表示:一个值张量和一个 2D 索引张量。

二、稀疏张量的创建和操作

(一)创建稀疏张量

  1. 基本创建方法
    • 使用索引和值张量构造稀疏张量。
    • 示例代码:
      
      import torch

定义索引张量 (LongTensor) 和值张量 (FloatTensor)

 indices = torch.LongTensor([[0, 1, 1], [2, 0, 2]])
 values = torch.FloatTensor([3, 4, 5])

创建稀疏张量,指定大小

 sparse_tensor = torch.sparse.FloatTensor(indices, values, torch.Size([2, 3]))

转换为密集张量查看结果

 dense_tensor = sparse_tensor.to_dense()
 print(dense_tensor)
 ```

  1. 混合稀疏张量
    • 仅前 n 个维度是稀疏的,其余维度是密集的。
    • 示例代码:
      indices = torch.LongTensor([[2, 4]])
      values = torch.FloatTensor([[1, 3], [5, 7]])
      mixed_sparse_tensor = torch.sparse.FloatTensor(indices, values)
      dense_mixed = mixed_sparse_tensor.to_dense()
      print(dense_mixed)

  1. 空稀疏张量
    • 指定大小构造空的稀疏张量。
    • 示例代码:
      empty_sparse = torch.sparse.FloatTensor(2, 3)
      print(empty_sparse)

(二)稀疏张量的基本操作

  1. 加法操作
    • 对两个稀疏张量进行加法操作。
    • 示例代码:
      
      indices1 = torch.LongTensor([[0, 1], [0, 1]])
      values1 = torch.FloatTensor([2, 3])
      sparse1 = torch.sparse.FloatTensor(indices1, values1, torch.Size([2, 2]))

indices2 = torch.LongTensor([[0, 1], [1, 0]]) values2 = torch.FloatTensor([4, 5]) sparse2 = torch.sparse.FloatTensor(indices2, values2, torch.Size([2, 2]))

result_sparse = sparse1 + sparse2 print(result_sparse.to_dense())



2. **矩阵乘法**
   - 稀疏矩阵与密集矩阵的乘法。
   - 示例代码:
     ```python
     sparse_mat = torch.sparse.FloatTensor(indices, values, torch.Size([2, 3]))
     dense_mat = torch.randn(3, 2)
     product = torch.sparse.mm(sparse_mat, dense_mat)
     print(product)

  1. 求和操作
    • 对稀疏张量指定维度求和。
    • 示例代码:
      sum_result = torch.sparse.sum(sparse_tensor, dim=1)
      print(sum_result.to_dense())

(三)稀疏张量的属性和方法

  1. coalesce()
    • 合并稀疏张量中重复的索引项。
    • 示例代码:
      
      # 创建一个包含重复索引的稀疏张量
      indices_repeat = torch.LongTensor([[0, 0, 1], [1, 1, 0]])
      values_repeat = torch.FloatTensor([1, 1, 2])
      sparse_repeat = torch.sparse.FloatTensor(indices_repeat, values_repeat, torch.Size([2, 2]))

合并重复索引

 coalesced_sparse = sparse_repeat.coalesce()
 print(coalesced_sparse.indices())
 print(coalesced_sparse.values())
 ```

  1. is_coalesced()
    • 检查稀疏张量是否已合并。
    • 示例代码:
      print(sparse_tensor.is_coalesced())
      print(coalesced_sparse.is_coalesced())

  1. indices()values()
    • 获取稀疏张量的索引和值张量。
    • 示例代码:
      print(sparse_tensor.indices())
      print(sparse_tensor.values())

  1. to_dense()
    • 将稀疏张量转换为密集张量。
    • 示例代码:
      dense_tensor = sparse_tensor.to_dense()
      print(dense_tensor)

三、稀疏张量的应用场景

(一)自然语言处理中的稀疏嵌入

在自然语言处理任务中,词嵌入矩阵通常是稀疏的。使用稀疏张量可以有效减少内存占用并加速计算。

## 假设有一个稀疏的词嵌入矩阵
word_indices = torch.LongTensor([[0, 2], [1, 3]])
word_values = torch.FloatTensor([[0.1, 0.2], [0.3, 0.4]])
embedding_sparse = torch.sparse.FloatTensor(word_indices, word_values, torch.Size([10000, 128]))


## 在模型中使用稀疏嵌入
dense_output = embedding_sparse.mm(input_vector)

(二)推荐系统中的稀疏用户-项目交互矩阵

推荐系统中用户与项目的交互数据通常是稀疏的。利用稀疏张量可以高效地存储和处理这些数据。

## 创建用户-项目交互稀疏矩阵
user_indices = torch.LongTensor([[0, 1, 2], [3, 5, 7]])
interaction_values = torch.FloatTensor([1, 1, 1])
user_item_matrix = torch.sparse.FloatTensor(user_indices, interaction_values, torch.Size([1000, 1000]))


## 使用稀疏矩阵进行模型训练
model_output = user_item_matrix.mm(item_embeddings)

四、总结

通过本教程,我们详细介绍了 PyTorch 中稀疏张量的创建、操作及应用场景。稀疏张量在处理大规模数据时能够显著节省内存和计算资源,适用于自然语言处理、推荐系统等多个领域。掌握稀疏张量的使用方法,可以帮助我们更高效地构建和优化深度学习模型。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号