如何将传统代码加载到GPU中加速

文章详细对比了在CUDAGPU环境与NumPy之间进行tensor转换的步骤,以及在PyTorch中如何实现各种数学运算,包括随机数生成、矩阵操作、采样、数学函数、布尔操作和矩阵形状变换。此外,还讨论了如何将字典类型的对象转换为CUDA兼容的格式。
摘要由CSDN通过智能技术生成

设置cuda

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
 
model.to(device)

numpy转化为cuda

由于numpy比较基础和通用,但是GPU上跑实验必须使用tensor,故还是直接用torch里面的函数更加直接快速,其两者直接的对比整理如下:

import numpy as np
import torch
import torch.nn.functional as tnf

生成类操作

用途numpytorch
随机整数np.random.randint(0,2,(4,3))torch.empty(4,3).random_(0,2)
[0,1)均匀分布np.random.rand(3,4)torch.rand(3,4)
任意均匀分布np.random.uniform(-1,1,(3,4))torch.empty(3,4).uniform_(-1,1)
标准正态分布np.random.randn(3,4)
全1矩阵np.ones((3,4))torch.ones(3,4)
3阶单位矩阵np.identity(3)或np.eye(3)torch.eye(3)
取出矩阵a的k对角元素np.diag(a,k)torch.diag(a,k)
取出矩阵a的下三k角矩阵np.tril(a,k)torch.tril(a,k)
取出矩阵a的上三k角矩阵np.triu(a,k)torch.triu(a,k)
指定范围,指定步长差,生成等差数列np.arange(5)torch.arange(5)
指定范围,指定生成个数,生成等差数列np.linspace(1,5,2)torch.linspace(1,5,2)
原地打乱顺序np.random.shuffle(a)
非原地打乱顺序np.random.permutation(a)

采样类

用途numpytorch
给定集合a,给定各元素权值p,有/无放回的抽样np.random.choice(a, size=None, replace=True, p=None)torch.multinomial(weight, num_samples, replacement=False)

数学运算操作

用途numpytorch
取幂np.power(2,3)torch.pow(torch.tensor([2]),torch.tensor([3]))
取指数np.exp(x)torch.exp(x)
矩阵求逆np.linalg.inv(a)torch.inverse(a)
向量点积np.dot(a,b)torch.dot(a,b)
转置a.Ta.T
矩阵相乘np.matmul(a,b)torch.matmul(a,b)
对a保留d位小数,后面的四舍五入np.round(a,d)
求解一个向量或者矩阵的范数a.norm()/torch.norm(a)
获得最大的k个元素a.topk(k)
求累加和np.cumsum(a)torch.cumsum(a)
求最大值(可按照维度)np.max(a)torch.max(a)
求最小值(可按照维度)np.min(a)torch.min(a)
求最大值所在位置(可按照维度)np.argmax(a)torch.argmax(a)
求最小值所在位置(可按照维度)np.argmin(a)torch.argmin(a)
求多个随机变量(一个随机变量代表一行)的 Pearson product-moment correlation coefficients(可以认为类似于协方差矩阵).np.corrcoef(a)
沿着某一个维度,计算相邻元素的差np.diff(a)torch.diff(a)

判断类(布尔类)操作

用途numpytorch
返回为真的索引np.argwhere(a==k)torch.nonzero(a==k)
某个维度上,布尔值有真np.any(a,axis)torch.any(a)
某个维度上,布尔值皆真np.all(a,axis)torch.all(a)
两个布尔数组与np.logical_and(a,b)
两个布尔数组或np.logical_or(a,b)
给定一个布尔值,在False处用y修改xnp.where(x>1,x,y)torch.where(x>1,x,y)
返回满足条件的索引np.where(x>1)[0]torch.where(x>1)[0]

矩阵形状操作

用途numpytorch
高维矩阵扁平化a.flatten()a.flatten()=a.flatten(start_dim=0, end_dim=-1)=torch.flatten(a,start_dim=0, end_dim=-1)
生成第k个维度np.expand_dims(a,k)torch.unsqueeze(a,k)

组合类操作

先说torch,这一类操作是torch开发出来节省计算效率和提高数值稳定性的,比如softmax和log结合。

用途numpytorch
先softmax后logtnf.log_softmax(a)
先exp,然后sum,然后对求和结果logtorch.logsumexp(a)

其他操作

用途numpytorch
修改数据类型a.astype(np.int32)a.type(torch.int32)
复制矩阵b=a.copy()b=a.clone()
删除指定位置的元素np.delete(a,index)
根据布尔索引删除元素np.delete(a,bool_index)
对a在维度0上逆序torch.flip(a,dims=[0])

转化字典类型

obj=obj.cuda()

其中obj是一个字典,但是字典类型不支持直接cuda()操作。可以用下面的方法将obj的每个value都变成cuda()类型。

obj={key:obj[key].cuda() for key in obj}

参考资料

torch.tensor、torch.Tensor等的对比
解决最小二乘法问题

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值