PyTorch gather与scatter_详解

该文章已生成可运行项目,

PyTorch gather与scatter_详解

在 PyTorch 常用的算子中,有两个理解巅峰的存在,那就是 torch.gathertorch.scatter_,在 Seq2SeqAttentioncrf viterbi等结构的源码中,都可以看到这两个算子的身影,今天来详细讲解一下这两个函数。

torch.gather

使用

torch.gather 函数用于从输入张量的指定维度收集元素。收集的索引由 index 张量提供。

使用语法:torch.gather(input, dim, index, *, sparse_grad=False, out=None) → Tensor

核心参数

  • input:输入张量
  • dim:指定的维度
  • index:索引张量,包含收集元素的索引

注意

  • inputindex 必须要有相同的维度
  • 对于所有的 d != dim,都必须要有 index.size(d) <= input.size(d)以及out 的形状和 index形状相同
  • inputindex 之间没有广播机制
  • 只有在 src.shape == index.shape 时实现了反向传播
说明

以一个三维的张量为例

out[i][j][k] = input[index[i][j][k]][j][k]  # if dim == 0
out[i][j][k] = input[i][index[i][j][k]][k]  # if dim == 1
out[i][j][k] = input[i][j][index[i][j][k]]  # if dim == 2

看一个示意图(这里index和dim都是从1开始,转换成代码时 -1 即可
img

再看一个示意图,应该懂了

  • dim=0
    img
dim = 0
input = torch.tensor([[10, 11, 12], [13, 14, 15], [16, 17, 18]])
index = torch.tensor([[0, 1, 2], [1, 2, 0]])
# 将 index 的 dim=0 处固定 然后其他位置按顺序填充
# [['0'-0, '1'-1, '2'-2],  ['1'-0, '2'-1, '0'-2]]
# [[(0, 0), (1, 1), (2, 2)], [(1, 0), (2, 1), (0, 2)]]

output = torch.gather(input, dim, index)
# tensor([[10, 14, 18],
#         [13, 17, 12]])
  • dim=1
    img
dim = 1
input = torch.tensor([[10, 11, 12], [13, 14, 15], [16, 17, 18]])
index = torch.tensor([[0, 1], [1, 2], [2, 0]])
# 将 index 的 dim=1 处固定 然后其他位置按顺序填充
# [[0-'0', 0-'1'], [1-'1', 1-'2'], [2-'2', 2-'0']]
# [[(0, 0), (0, 1)], [(1, 1), (1, 2)], [(2, 2), (2, 0)]]

output = torch.gather(input, dim, index)
# tensor([[10, 11],
#         [14, 15],
#         [18, 16]])
案例

假设我们有一个 2D 张量 data,我们希望根据索引张量 indexdata 中提取特定位置的值。

import torch

# 创建一个 2D 张量 data
data = torch.tensor([[1, 2, 3],
                     [4, 5, 6],
                     [7, 8, 9]])
print("Data tensor:")
print(data)

# 创建一个索引张量 index
index = torch.tensor([[0, 2],
                      [1, 0],
                      [2, 1]])
print("\nIndex tensor:")
print(index)

# 使用 gather 函数
result = torch.gather(data, 1, index)
print("\nGathered result:")
print(result)

我们对上面案例进行逐步解释

  1. 初始张量 data:

    data = torch.tensor([[1, 2, 3],
                         [4, 5, 6],
                         [7, 8, 9]])
    

    这是一个 3x3 的张量:

    tensor([[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]])
    
  2. 索引张量 index:

    index = torch.tensor([[0, 2],
                          [1, 0],
                          [2, 1]])
    

    这是一个 3x2 的张量,表示要从 data 中提取的索引。

  3. 使用 gather 函数:

    result = torch.gather(data, 1, index)
    

    这个操作会根据 index 张量中的索引,从 data 张量中提取相应位置的值。具体操作如下:

    • 对于 data 的第 0 行:

      • index[0, 0] = 0,所以 result[0, 0] = data[0, 0] = 1
      • index[0, 1] = 2,所以 result[0, 1] = data[0, 2] = 3
    • 对于 data 的第 1 行:

      • index[1, 0] = 1,所以 result[1, 0] = data[1, 1] = 5
      • index[1, 1] = 0,所以 result[1, 1] = data[1, 0] = 4
    • 对于 data 的第 2 行:

      • index[2, 0] = 2,所以 result[2, 0] = data[2, 2] = 9
      • index[2, 1] = 1,所以 result[2, 1] = data[2, 1] = 8

最终,result 张量为:

tensor([[1, 3],
        [5, 4],
        [9, 8]])

torch.scatter_

使用

torch.scatter_ 是 PyTorch 中一个用于在特定维度上根据索引将值写入张量的原地操作函数。

使用语法:Tensor.scatter_(dim, index, src, *, reduce=None) → Tensor

核心参数

  • dim:指定沿着哪个维度进行散射操作
  • index:一个包含索引的张量,指定 src 中的值要写入 tensor 的位置
  • src:包含要写入 tensor 的值的张量

注意

  • self, indexsrc必须有相同的维度
  • 对于所有的维度 d 必须有 index.size(d) <= src.size(d)以及index.size(d) <= self.size(d)
  • indexsrc 不会进行广播
说明

torch.scatter_ 其实就是torch.gather 的一个逆运算

以一个三维的张量为例

self[index[i][j][k]][j][k] = src[i][j][k]  # if dim == 0
self[i][index[i][j][k]][k] = src[i][j][k]  # if dim == 1
self[i][j][index[i][j][k]] = src[i][j][k]  # if dim == 2

另外,需要注意,scatter_ 是一个 inplace 算子

案例

先来看 dim=0 的情况

import torch
import numpy as np
src = torch.arange(1, 11).view(2, 5)
print(src)
> tensor([[ 1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10]])

input_tensor = torch.zeros(3, 5).long()
print(input_tensor)
> tensor([[0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0]])

index_tensor = torch.tensor([[0, 1, 2, 0, 0], [2, 0, 0, 1, 2]])
print(index_tensor)
> tensor([[0, 1, 2, 0, 0],
        [2, 0, 0, 1, 2]])

## try to manually work out the result 
dim = 0
input_tensor.scatter_(dim, index_tensor, src)
print(input_tensor)
> ...
  • step1:将 src 的第1列分散到 input _tensor 的第1列。与指数张量的第1列相匹配。我们把1分散到0排,6分散到2排。

img

  • step2:将 src 的第2列分散到 input _ tensor 的第2列。与指数张量第2列匹配。我们把2分散到第1排,把7分散到第0排。

img

  • step3/4/5:以此类推,继续对其他列做散射。最后,我们将得到如下图。

img

运行代码,检查最终结果

> tensor([[ 1,  7,  8,  4,  5],
        [ 0,  2,  0,  9,  0],
        [ 6,  0,  3,  0, 10]])

再来看 dim=1 的情况

origin data

import torch

src = torch.arange(1, 11).view(2, 5)
input_tensor = torch.zeros(3, 5).long()
index_tensor = torch.tensor([[3, 0, 2, 1, 4], [2, 0, 1, 3, 1]])
dim = 1
input_tensor.scatter_(dim, index_tensor, src)
print(input_tensor)
  • step1:将 src 的第一行散布到 input _ tensor 的第一行。1到 col3,2到 col0,3到 col2,4到 col1,5到 col4。

img

  • step2:将 src 的第2行散布到 input _ tensor 的第2行。

注意:index _ tensor 的第二行有两个1。为了使更新更清晰,我将这一步分为两个子步骤。

  • step2.1:分散6到 col2,7到 col0,8到 col1,9到 col3。

img

  • step2.2:对10进行分散,相应的索引是1,但是该位置8已经存在了,我们需要用10来覆盖8。

img

运行代码,检查最终结果

> tensor([[ 2,  4,  3,  1,  5],
        [ 7, 10,  6,  9,  0],
        [ 0,  0,  0,  0,  0]])

参考

PyTorch torch.gather

PyTorch torch.scatter_

What does gather() do in PyTorch

Understand torch.scatter_()

本文章已经生成可运行项目
(base) PS C:\Users\ASUS> conda search pytorch Loading channels: done # Name Version Build Channel pytorch 1.0.1 cpu_py36h39a92a0_0 pkgs/main pytorch 1.0.1 cpu_py37h39a92a0_0 pkgs/main pytorch 1.3.1 cpu_py36h9f948e0_0 pkgs/main pytorch 1.3.1 cpu_py37h9f948e0_0 pkgs/main pytorch 1.4.0 cpu_py36ha775e86_0 pkgs/main pytorch 1.4.0 cpu_py37ha775e86_0 pkgs/main pytorch 1.4.0 cpu_py38ha775e86_0 pkgs/main pytorch 1.5.0 cpu_py37h9f948e0_0 pkgs/main pytorch 1.6.0 cpu_py37h538a6d7_0 pkgs/main pytorch 1.6.0 cpu_py38h538a6d7_0 pkgs/main pytorch 1.10.2 cpu_py310habb1308_0 pkgs/main pytorch 1.10.2 cpu_py37h907fbb5_0 pkgs/main pytorch 1.10.2 cpu_py38h907fbb5_0 pkgs/main pytorch 1.10.2 cpu_py39h907fbb5_0 pkgs/main pytorch 1.12.1 cpu_py310h5e1f01c_0 pkgs/main pytorch 1.12.1 cpu_py310h5e1f01c_1 pkgs/main pytorch 1.12.1 cpu_py37h5e1f01c_0 pkgs/main pytorch 1.12.1 cpu_py37h5e1f01c_1 pkgs/main pytorch 1.12.1 cpu_py38h5e1f01c_0 pkgs/main pytorch 1.12.1 cpu_py38h5e1f01c_1 pkgs/main pytorch 1.12.1 cpu_py39h5e1f01c_0 pkgs/main pytorch 1.12.1 cpu_py39h5e1f01c_1 pkgs/main pytorch 2.0.1 cpu_py310hb0bdfb8_0 pkgs/main pytorch 2.0.1 cpu_py310hb0bdfb8_1 pkgs/main pytorch 2.0.1 cpu_py311hd080823_0 pkgs/main pytorch 2.0.1 cpu_py311hd080823_1 pkgs/main pytorch 2.0.1 cpu_py38hb0bdfb8_0 pkgs/main pytorch 2.0.1 cpu_py38hb0bdfb8_1 pkgs/main pytorch 2.0.1 cpu_py39hb0bdfb8_0 pkgs/main pytorch 2.0.1 cpu_py39hb0bdfb8_1 pkgs/main pytorch 2.1.0 cpu_py310hb0bdfb8_0 pkgs/main pytorch 2.1.0 cpu_py311hd080823_0 pkgs/main pytorch 2.1.0 cpu_py38hb0bdfb8_0 pkgs/main pytorch 2.1.0 cpu_py39hb0bdfb8_0 pkgs/main pytorch 2.2.0 cpu_py310hb0bdfb8_0 pkgs/main pytorch 2.2.0 cpu_py311hd080823_0 pkgs/main pytorch 2.2.0 cpu_py312h746a3fd_0 pkgs/main pytorch 2.2.0 cpu_py38hb0bdfb8_0 pkgs/main pytorch 2.2.0 cpu_py39hb0bdfb8_0 pkgs/main pytorch 2.3.0 cpu_py310h482c993_1 pkgs/main pytorch 2.3.0 cpu_py310h9432977_0 pkgs/main pytorch 2.3.0 cpu_py311hdee6804_0 pkgs/main pytorch 2.3.0 cpu_py311he6429e2_1 pkgs/main pytorch 2.3.0 cpu_py312h443c98c_1 pkgs/main pytorch 2.3.0 cpu_py312h83d76c9_0 pkgs/main pytorch 2.3.0 cpu_py38h482c993_1 pkgs/main pytorch 2.3.0 cpu_py38h9432977_0 pkgs/main pytorch 2.3.0 cpu_py39h482c993_1 pkgs/main pytorch 2.3.0 cpu_py39h9432977_0 pkgs/main pytorch 2.3.1 cpu_py310h0ce1571_0 pkgs/main pytorch 2.3.1 cpu_py311h0ce1571_0 pkgs/main pytorch 2.3.1 cpu_py312h0ce1571_0 pkgs/main pytorch 2.3.1 cpu_py39h0ce1571_0 pkgs/main pytorch 2.5.1 cpu_mkl_py310_h45c3603_109 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py310_h45c3603_110 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py310_h45c3603_111 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py310_h45c3603_113 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py310_h45c3603_114 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py310_h81ea9c4_116 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py310_h946cf0a_117 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py310_hefc17d5_115 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py310h0452e45_103 pkgs/main pytorch 2.5.1 cpu_mkl_py310h0452e45_104 pkgs/main pytorch 2.5.1 cpu_mkl_py310hc9ee3b7_101 pkgs/main pytorch 2.5.1 cpu_mkl_py310hc9ee3b7_102 pkgs/main pytorch 2.5.1 cpu_mkl_py311_h12a0797_115 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py311_h6c3aab5_116 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py311_haf50ba6_109 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py311_haf50ba6_110 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py311_haf50ba6_111 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py311_haf50ba6_113 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py311_haf50ba6_114 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py311_he3a4796_117 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py311h0452e45_103 pkgs/main pytorch 2.5.1 cpu_mkl_py311h0452e45_104 pkgs/main pytorch 2.5.1 cpu_mkl_py311hc9ee3b7_101 pkgs/main pytorch 2.5.1 cpu_mkl_py311hc9ee3b7_102 pkgs/main pytorch 2.5.1 cpu_mkl_py312_h2611d89_115 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py312_h71c54e9_109 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py312_h71c54e9_110 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py312_h71c54e9_111 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py312_h71c54e9_113 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py312_h71c54e9_114 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py312_h9ecdb75_117 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py312_hd855873_116 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py312h0452e45_103 pkgs/main pytorch 2.5.1 cpu_mkl_py312h0452e45_104 pkgs/main pytorch 2.5.1 cpu_mkl_py312hc9ee3b7_101 pkgs/main pytorch 2.5.1 cpu_mkl_py312hc9ee3b7_102 pkgs/main pytorch 2.5.1 cpu_mkl_py313_h3c06813_115 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py313_h618de16_109 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py313_h618de16_110 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py313_h618de16_111 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py313_h618de16_113 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py313_h618de16_114 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py313_hcf424e3_116 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py313_hec26e21_117 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py313h0452e45_103 pkgs/main pytorch 2.5.1 cpu_mkl_py313h0452e45_104 pkgs/main pytorch 2.5.1 cpu_mkl_py313hc9ee3b7_102 pkgs/main pytorch 2.5.1 cpu_mkl_py39_h1a4409b_116 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py39_h5b11d1b_109 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py39_h5b11d1b_110 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py39_h5b11d1b_111 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py39_h5b11d1b_113 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py39_h5b11d1b_114 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py39_h5b7e04a_115 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py39_hab059a2_117 anaconda/cloud/conda-forge pytorch 2.5.1 cpu_mkl_py39h0452e45_103 pkgs/main pytorch 2.5.1 cpu_mkl_py39h0452e45_104 pkgs/main pytorch 2.5.1 cpu_mkl_py39hc9ee3b7_101 pkgs/main pytorch 2.5.1 cpu_mkl_py39hc9ee3b7_102 pkgs/main pytorch 2.5.1 cuda126_mkl_py310_h5866544_316 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py310_h6518810_309 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py310_h6518810_310 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py310_h6518810_311 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py310_h6518810_312 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py310_h6518810_313 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py310_h6518810_314 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py310_h67a8d91_317 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py310_h784a0d1_315 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py311_h17a855d_315 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py311_h733cea4_309 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py311_h733cea4_310 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py311_h733cea4_311 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py311_h733cea4_312 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py311_h733cea4_313 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py311_h733cea4_314 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py311_h91667ce_317 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py311_hb5fcb89_316 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py312_h4995605_316 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py312_h836905d_309 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py312_h836905d_310 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py312_h836905d_311 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py312_h836905d_312 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py312_h836905d_313 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py312_h836905d_314 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py312_hd6ead81_317 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py312_hefba97c_315 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py313_h350bcf7_316 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py313_h623afa4_317 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py313_haa27eae_315 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py313_hde0ee88_309 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py313_hde0ee88_310 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py313_hde0ee88_311 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py313_hde0ee88_312 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py313_hde0ee88_313 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py313_hde0ee88_314 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py39_h442358c_317 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py39_h5dc7ac5_309 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py39_h5dc7ac5_310 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py39_h5dc7ac5_311 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py39_h5dc7ac5_312 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py39_h5dc7ac5_313 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py39_h5dc7ac5_314 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py39_h73a3937_316 anaconda/cloud/conda-forge pytorch 2.5.1 cuda126_mkl_py39_h8fb42cc_315 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py310_h6a75725_101 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py310_h946cf0a_104 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py310_hae4af60_100 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py310_haf0a941_102 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py310_haf0a941_103 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py311_h0e1fb65_100 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py311_hde8219b_101 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py311_he3a4796_104 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py311_hf1dca07_102 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py311_hf1dca07_103 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py312_h9ecdb75_104 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py312_ha0dda7b_100 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py312_hbe4fd08_101 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py312_hddd5644_102 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py312_hddd5644_103 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py313_h2b488f0_102 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py313_h2b488f0_103 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py313_h860d2b0_100 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py313_hec26e21_104 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py313_hf31fdbd_101 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py39_h8451931_100 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py39_h921a9b4_102 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py39_h921a9b4_103 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py39_hab059a2_104 anaconda/cloud/conda-forge pytorch 2.6.0 cpu_mkl_py39_hcdd5422_101 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py310_h2c15e31_301 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py310_h3ac3ac7_303 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py310_h67a8d91_304 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py310_ha356eb8_300 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py310_he46af8b_302 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py311_h77de8ba_302 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py311_h91667ce_304 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py311_hbd134b9_303 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py311_hf7a6fb9_301 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py311_hf8a61ff_300 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py312_h2202cd8_302 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py312_h77db4c5_301 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py312_h78a6f98_303 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py312_h9ada978_300 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py312_hd6ead81_304 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py313_h2dc966e_302 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py313_h40ee0ab_300 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py313_h623afa4_304 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py313_hacae596_301 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py313_hcbbcc47_303 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py39_h2263e14_302 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py39_h2e16fe0_301 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py39_h442358c_304 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py39_h9f1eb02_300 anaconda/cloud/conda-forge pytorch 2.6.0 cuda126_mkl_py39_hda066c2_303 anaconda/cloud/conda-forge pytorch 2.7.0 cpu_mkl_py310_h8e04999_100 anaconda/cloud/conda-forge pytorch 2.7.0 cpu_mkl_py311_hd9bee84_100 anaconda/cloud/conda-forge pytorch 2.7.0 cpu_mkl_py312_h83f7478_100 anaconda/cloud/conda-forge pytorch 2.7.0 cpu_mkl_py313_h7ec8dd8_100 anaconda/cloud/conda-forge pytorch 2.7.0 cpu_mkl_py39_hb8024a4_100 anaconda/cloud/conda-forge pytorch 2.7.0 cuda126_mkl_py310_h61b71b3_300 anaconda/cloud/conda-forge pytorch 2.7.0 cuda126_mkl_py311_h67a27b6_300 anaconda/cloud/conda-forge pytorch 2.7.0 cuda126_mkl_py312_h644dd61_300 anaconda/cloud/conda-forge pytorch 2.7.0 cuda126_mkl_py313_hf8c1e03_300 anaconda/cloud/conda-forge pytorch 2.7.0 cuda126_mkl_py39_h7d88c2c_300 anaconda/cloud/conda-forge
06-04
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值