Pytorch使用教学4-张量的索引

在这里插入图片描述

1 张量的符号索引

张量也是有序序列,我们可以根据每个元素在系统内的顺序位置,来找出特定的元素,也就是索引。

1.1 一维张量的索引

一维张量由零维张量构成

一维张量索引与Python中的索引一样是是从左到右,从0开始的,遵循格式为[start: end: step]

t1 = torch.arange(1, 11)
t1
# tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

# 取出索引位置是0的元素
t1[0]
# tensor(1)

:张量索引出的结果是零维张量,而不是单独的数。要转化成单独的数还需使用上节介绍的item()方法。

可理解为构成一维张量的是零维张量,而不是单独的数。

张量的step必须大于0

# 索引3-10号元素,左闭右开,默认step为1
t1[2: 8]
# tensor([3, 4, 5, 6, 7, 8])

# step=3,隔3个数取一个,左闭右开
t1[2: 8: 2]
# tensor([3, 5, 7])

Python中,step可以为负数,例如:

li = [1, 2, 3]
# 列表倒叙排列,取所有数值,从后往前取
li[ ::-1]
# [3, 2, 1]

但在张量中,step必须大于1,否则就会报错。

t1 = torch.arange(1, 11)
t1[ ::-1]
# ValueError: step must be greater than zero

1.2 二维张量的索引

二维张量的索引逻辑和一维张量的索引逻辑相同,二维张量可以视为两个一维张量组合而成。

t2 = torch.arange(1, 17).reshape(4, 4)
t2
#tensor([[ 1,  2,  3,  4],
#        [ 5,  6,  7,  8],
#        [ 9, 10, 11, 12],
#        [13, 14, 15, 16]])

t2[0,1]也可用t2[0][1]的表示。

# 表示索引第一行、第二个(第二列的)元素
t2[0, 1]
# tensor(2)

t2[0][1]
# tensor(2)

但是t2[::2, ::2]t2[::2][ ::2]的索引结果就不同:

t2[::2, ::2]
# tensor([[ 1,  3],
#        [ 9, 11]])

t2[::2][::2]
# tensor([[1, 2, 3, 4]])

t2[::2, ::2]二维索引使用逗号隔开时,可以理解为全局索引,取第一行和第三行的第一列和第三列的元素。

t2[::2][::2]二维索引在两个中括号中时,可以理解为先取了第一行和第三行,构成一个新的二维张量,然后在此基础上又间隔2并对所有张量进行索引。

tt = t2[::2]
# tensor([[ 1,  2,  3,  4],
#         [ 9, 10, 11, 12]])
tt[::2]
# tensor([[1, 2, 3, 4]])

1.3 三维张量的索引

设三维张量的shapex、y、z,则可理解为它是由x个二维张量构成,每个二维张量由y个一维张量构成,每个一维张量由z个元素构成。

t3 = torch.arange(1, 28).reshape(3, 3, 3)
t3
# tensor([[[ 1,  2,  3],
#         [ 4,  5,  6],
#         [ 7,  8,  9]],

#         [[10, 11, 12],
#         [13, 14, 15],
#         [16, 17, 18]],

#         [[19, 20, 21],
#         [22, 23, 24],
#         [25, 26, 27]]])

# 索引第二个矩阵中的第二行、第二个元素
t3[1, 1, 1]
# tensor(14)

# 索引第二个矩阵,行和列都是每隔两个取一个
t3[1, ::2, ::2]
# tensor([[10, 12],
#         [16, 18]])

高维张量的思路与低维一样,就是围绕张量的“形状”进行索引。

2 张量的函数索引

2.1 一维张量的函数索引

PyTorch中,我们还可以使用index_select函数指定index来对张量进行索引,index的类型必须为Tensor

index_select(dim, index)表示在张量的哪个维度进行索引,索引的位值是多少。

t1 = torch.arange(1, 11)
indices = torch.tensor([1, 2])
# tensor([1, 2])
t1.index_select(0, indices)
# tensor([2, 3])

对于t1这个一维向量来说,由于只有一个维度,第二个参数取值为0,就代表在第一个维度上进行索引,索引的位置是1和2。

:这里取出的是位置,而不是取出[1:2]区间内左闭右开的元素。

2.2 二维张量的函数索引

t2 = torch.arange(12).reshape(4, 3)
t2
# tensor([[ 0,  1,  2],
#         [ 3,  4,  5],
#         [ 6,  7,  8],
#         [ 9, 10, 11]])

t2.shape
# torch.Size([4, 3])

indices = torch.tensor([1, 2])
t2.index_select(0,indices)
# tensor([[3, 4, 5],
#         [6, 7, 8]])

此时dim参数取值为0,代表在shape的第一个维度上进行索引。

t2 = torch.arange(12).reshape(4, 3)
indices = torch.tensor([1, 1])
t2.index_select(1, indices)
# tensor([[ 1,  1],
#        [ 4,  4],
#        [ 7,  7],
#        [10, 10]])

此时dim参数取值为1,代表在shape的第二个维度上进行索引。index参数的值为[1,1],就代表取出第二个维度上为1的元素2次。

下面可以再次理解:

t2 = torch.arange(12).reshape(4, 3)
t2
# tensor([[ 0,  1,  2],
#         [ 3,  4,  5],
#         [ 6,  7,  8],
#         [ 9, 10, 11]])

t2.shape
# torch.Size([4, 3])

indices = torch.tensor([2, 2, 2])
t2.index_select(1, indices)
# tensor([[ 2,  2,  2],
#         [ 5,  5,  5],
#         [ 8,  8,  8],
#         [11, 11, 11]])

取出第二个维度上为2的元素3次。

高维张量函数索引的思路与低维一样,都是在shape的维度上进行操作。

PyTorch中很多函数都采用的是第几维的思路,后面会介绍给大家,大家还需勤加练习,适应这种思路。同时使用函数式索引,在习惯后对代码可读性会有很大提升。

Pytorch张量操作大全:

Pytorch使用教学1-Tensor的创建
Pytorch使用教学2-Tensor的维度
Pytorch使用教学3-特殊张量的创建与类型转化
Pytorch使用教学4-张量的索引
Pytorch使用教学5-视图view与reshape的区别
Pytorch使用教学6-张量的分割与合并
Pytorch使用教学7-张量的广播
Pytorch使用教学8-张量的科学运算
Pytorch使用教学9-张量的线性代数运算
Pytorch使用教学10-张量操作方法大总结

有关Pytorch建模相关的AI干货请扫码关注公众号「AI有温度」阅读获取
在这里插入图片描述

<think>我们正在解决的问题是:用户使用conda命令安装PyTorch GPU版本,但安装后却是CPU版本。我们将根据用户提供的引用和之前的知识来解答。 用户提供的安装命令是: conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia 但安装后检测发现是CPU版本。可能的原因和解决方案如下: 1. **环境问题**:确保安装时已经激活了目标conda环境。 2. **命令中的cuda版本与系统CUDA版本不匹配**:虽然用户指定了`pytorch-cuda=11.7`,但需要确认系统CUDA版本(通过`nvidia-smi`查看)是否与安装的版本兼容。不过,即使不匹配,通常也会安装GPU版本,只是可能无法使用。 3. **安装源的问题**:使用`-c pytorch -c nvidia`指定了官方源,但可能由于网络问题导致实际下载的是CPU版本(因为有时PyTorch的conda包会根据平台自动选择,但指定了cuda版本应该不会)。 4. **平台识别错误**:conda可能会根据当前平台(如操作系统)选择包,但用户明确指定了cuda版本,所以应该安装GPU版本。 然而,根据引用[1]和[2],安装命令中指定了cuda版本(如`pytorch-cuda=12.1`或`cudatoolkit=11.1`)应该安装GPU版本。 经过分析,可能的原因之一是conda在解决依赖时选择了不包含GPU支持的PyTorch包。这可能是由于源中的包标记问题,或者与其他包的依赖冲突导致降级为CPU版本。 解决方案: 1. **检查安装日志**:在conda安装过程中,会显示将要安装的包及其来源。注意查看`pytorch`和`pytorch-cuda`的版本和构建标记。GPU版本的PyTorch通常会有`cuda`或`cudnn`在构建字符串中,而CPU版本则会有`cpu`。 2. **明确指定包版本和构建**:可以尝试明确指定PyTorch的构建标记为GPU版本。例如: ```bash conda install pytorch=1.13.1=py3.9_cuda11.7_cudnn8_0 torchvision torchaudio cudatoolkit=11.7 -c pytorch -c nvidia ``` 其中构建字符串`py3.9_cuda11.7_cudnn8_0`表示Python3.9,CUDA11.7,cuDNN8。具体构建字符串可以在[Anaconda Cloud](https://anaconda.org/pytorch/pytorch)上查找。 3. **使用pip安装**:conda有时可能无法正确解析依赖,可以尝试使用pip安装。但注意,pip安装的包可能与conda环境中的其他包冲突。根据PyTorch官网,对于CUDA11.7,pip命令为: ```bash pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117 ``` (注意:这里cu117对应CUDA11.7,但官网通常使用简写,如11.7对应cu117,但实际是cu117还是cu117?在PyTorch官网上,CUDA11.7对应的索引是cu117。所以命令中写cu1174. **创建新环境**:如果当前环境已经混乱,建议创建一个新的conda环境再安装。 5. **验证安装**:安装后,运行以下Python代码验证: ```python import torch print(torch.__version__) # 查看PyTorch版本 print(torch.cuda.is_available()) # 应该为True ``` 6. **检查CUDA工具包**:确保conda环境中安装了对应的cudatoolkit。使用`conda list`查看是否有`cudatoolkit`和`pytorch-cuda`包。 7. **注意渠道优先级**:conda会按照渠道的顺序(-c指定的顺序)查找包,因此确保先使用pytorch渠道,再使用nvidia渠道。 另外,用户提到引用[3]中关于SSL错误的问题,如果安装过程中遇到SSL错误,需要更新conda的SSL模块(如用户之前提供的解决方案)。 总结步骤: 1. 创建新环境(可选但推荐): ```bash conda create -n torch_gpu python=3.9 conda activate torch_gpu ``` 2. 尝试使用conda安装,并指定构建字符串(以PyTorch 1.13.1,CUDA11.7为例): ```bash conda install pytorch==1.13.1=py3.9_cuda11.7_cudnn8_0 torchvision torchaudio cudatoolkit=11.7 -c pytorch -c nvidia ``` 3. 如果conda安装仍然不行,使用pip安装(注意先卸载可能存在的CPU版本): ```bash conda uninstall pytorch torchvision torchaudio pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117 ``` 4. 验证安装。 注意:如果系统安装的CUDA版本与conda环境中安装的cudatoolkit版本不一致,PyTorch可能仍然能够使用GPU,因为PyTorch会自带CUDA运行时。但最好保持版本一致。 如果以上方法都不行,可能需要检查系统环境变量(如`LD_LIBRARY_PATH`)是否指向了某个CPU版本的库,或者系统是否有多个CUDA版本导致冲突。 最后,用户提供的命令中使用了`pytorch-cuda=11.7`,这是PyTorch 1.13.0及以后版本的新方式。在之前的版本中,我们使用`cudatoolkit=11.7`。现在,`pytorch-cuda`是一个单独的包,它提供了PyTorch所需的CUDA运行时。所以,使用`pytorch-cuda`是正确的方式。但为什么安装了CPU版本呢?可能是由于在conda的默认渠道中,PyTorch的CPU版本被优先选择,或者用户平台(如Windows)的包在指定渠道中没有GPU版本。 因此,我们还需要确认用户的操作系统。如果是Windows,有时conda的pytorch渠道可能没有提供预编译的GPU版本,这时可能需要通过pip安装。 综上所述,我们提供以上解决方案。</think>### 安装 PyTorch GPU 版本后显示为 CPU 版本的原因及解决方案 #### 问题原因分析 当使用命令 `conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia` 安装后仍显示 CPU 版本,主要存在以下原因: 1. **环境未完全隔离** Conda 环境未正确激活或存在环境变量污染,导致系统优先使用基础环境的 CPU 版本[^2]。 2. **依赖冲突导致降级** 安装过程中其他包依赖强制降级 PyTorch 到 CPU 版本(常见于已存在 CPU 版本的环境)[^1]。 3. **CUDA 版本不匹配** 系统 CUDA 版本(`nvidia-smi` 显示)与安装指定的 `pytorch-cuda=11.7` 不一致,导致自动回退到 CPU 版本。 4. **渠道优先级错误** `-c pytorch -c nvidia` 的渠道顺序可能导致依赖解析错误(应优先使用官方源)[^1]。 --- #### 解决方案步骤 ##### 1. 创建纯净环境(关键) ```bash # 删除旧环境避免冲突 conda deactivate conda env remove -n pytorch_gpu # 创建新环境 conda create -n pytorch_gpu python=3.9 -y conda activate pytorch_gpu ``` ##### 2. 验证 CUDA 兼容性 ```bash nvidia-smi # 查看实际CUDA版本(如11.7) ``` 若输出为 CUDA 12.x,需修改安装命令为 `pytorch-cuda=12.1`(参考[官网](https://pytorch.org)生成器)[^1]。 ##### 3. 强制指定 GPU 版本构建 ```bash # 添加版本锁定避免降级 conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 \ pytorch-cuda=11.7 -c pytorch -c nvidia ``` > 📌 **关键参数**: > - `pytorch==2.0.1` 明确版本 > - `pytorch-cuda=11.7` 匹配 CUDA 版本 > - 渠道顺序 `-c pytorch -c nvidia` 不可颠倒[^1] ##### 4. 替代安装方案(conda 失败时) ```bash # 使用 pip 安装(需先卸载 conda 版本) conda uninstall pytorch torchvision pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117 ``` ##### 5. 安装后验证 ```python import torch print(torch.__version__) # 应显示 2.0.1+cu117 print(torch.cuda.is_available()) # 必须返回 True print(torch.zeros(1).cuda()) # 应显示 GPU 张量 ``` 若显示 `2.0.1+cpu` 说明仍为 CPU 版本[^2]。 --- #### 疑难排查 - **依赖冲突检测**: ```bash conda list | grep cudatoolkit # 应显示 11.7 版本 conda list | grep pytorch-cuda # 应存在且版本匹配 ``` - **环境变量检查**: ```bash env | grep CUDA # 确保未设置 CUDA_HOME 等冲突变量 ``` - **安装日志分析**: 检查安装日志中是否出现 `cpu` 关键词,可能显示: ```log The following packages will be DOWNGRADED: pytorch: 2.0.1-cuda11.7 --> 2.0.1-cpu ``` > ⚠️ **终极解决方案**:若仍失败,建议使用 [Docker 镜像](https://hub.docker.com/r/pytorch/pytorch) 确保环境纯净性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值