device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)
由于numpy比较基础和通用,但是GPU上跑实验必须使用tensor,故还是直接用torch里面的函数更加直接快速,其两者直接的对比整理如下:
import numpy as np
import torch
import torch.nn.functional as tnf
生成类操作
用途 | numpy | torch |
---|
随机整数 | 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) | |
采样类
用途 | numpy | torch |
---|
给定集合a,给定各元素权值p,有/无放回的抽样 | np.random.choice(a, size=None, replace=True, p=None) | torch.multinomial(weight, num_samples, replacement=False) |
| | |
数学运算操作
用途 | numpy | torch |
---|
取幂 | 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.T | a.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) |
| | |
判断类(布尔类)操作
用途 | numpy | torch |
---|
返回为真的索引 | 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修改x | np.where(x>1,x,y) | torch.where(x>1,x,y) |
返回满足条件的索引 | np.where(x>1)[0] | torch.where(x>1)[0] |
矩阵形状操作
用途 | numpy | torch |
---|
高维矩阵扁平化 | 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结合。
用途 | numpy | torch |
---|
先softmax后log | | tnf.log_softmax(a) |
先exp,然后sum,然后对求和结果log | | torch.logsumexp(a) |
其他操作
用途 | numpy | torch |
---|
修改数据类型 | 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等的对比
解决最小二乘法问题