1、创建Tensor
函数 | 功能 |
---|---|
Tensor(*size) | 基础构造函数 |
ones(*size) | 全1 |
zeros(*size) | 全0 |
eye(*size) | 对角线为1,其他为0 |
arange(begin,end,step) | 从begin到end,步长为step |
linspace(begin,end,steps) | 从begin到end,等间隔取steps个值 |
rand/randn | 均匀/标准分布 |
normal(mean,std)/uniform(from,to) | 正态/均匀分布 |
randperm(m) | 随机排列 |
NOTE: Tensor(*size)
创建Tensor后不会马上分配空间,第一次用到时才会分配;其他操作都是创建完马上分配空间。
2、Tensor常用操作
用法 | 功能 | 备注 |
---|---|---|
tensor.size()、tensor.shape | 形状 | |
tensor.nelement()、tensor.numel() | 元素个数 | |
tensor.view(size) | 调整形状 | 参数为-1时自动计算大小 |
tensor.unsqueeze(dim) | 升维 | 在dim维度处升高一维 |
tensor.squeeze(dim) | 降维 | 只能压缩大小为1的维度,默认压缩所有大小为1的维度 |
tensor.resize_(*size) | 修改大小 | 若缩小,原数据依然被保存;若扩大,开辟新空间 |
NOTE: 如view()
、unsqueeze()
、squeeze()
这种只改变tensor的形状,而不涉及内存改变的函数,生成的新的Tensor和旧Tensor共享内存。
3、索引操作
-
笔记
-
Tensor的索引操作与
numpy.ndarray
类似。 -
x[0:1,:2]
与x[0,:2]
应注意维度上的差别。 -
x[x>1]
等价于x.masked_select(x>1)
,新旧tensor不共享内存。 -
LongTensor
类型可以用来做多列索引:x[2:4,t.LongTensor([0,3])]
。 -
gather(input,dim,index)
函数:out[i][j][k]=input[i][index[i][j][k]][k] ,if dim=j
。
高级索引 ?
-
x[[1,2],[3,4],[5,6]] # x[1,3,5]和x[2,4,6]
-
x[[1,2,3],4,5] # x[1,4,5]、x[2,4,5]、x[3,4,5]
-
x[[0,4],...] = x[[0,4],:] # x[0]和x[4]
tensor幂运算的指数最大是9223372036854775807,别问我怎么知道的,我慢慢试出来的。
有可能配置不一样这个最大限度也不一样,但是我还是想记下来 ?
4、逐元素操作
这类函数作用在每个元素上,不改变tensor形状。
部分逐元素操作:
函数 | 功能 |
---|---|
abs/sqrt/div/fmod/pow/cos/sin/asin/atan2/conh | 等等 |
ceil/round/floor/trunc | 上取整、四舍五入、下取整、保留整数部分 |
clamp(min,max) | 超出min和max部分截断 |
sigmod/tanh | 激活函数 |
5、归并操作
作用于某一维度或者整个tensor。
常用归并操作:
函数 | 功能 |
---|---|
mean/sum/median/mode | 均值/和/中位数/众数 |
norm/dist | 范数/距离 |
std/var | 标准差/方差 |
cumsum/cumprod | 累加/累乘 |
-
NOTE:
- 1、这里应该注意dim参数的意义。
- 2、生成的size中是否有1,取决于keepdim参数.
6、线性代数
主要封装了Blas和Lapack
函数 | 功能 |
---|---|
trace/diag | 对角线元素之和/对角线元素 |
triu/tril | 矩阵的上/下三角 |
dot/cross | 内积/外积 |
inverse | 逆矩阵 |
svd | 奇异值分解 |
mm/bmm | 矩阵乘法/batch的矩阵乘法 |
NOTE: 矩阵转置后,会导致存储空间不连续。
b = a.t()
b.is_contiguous() # False
b.contiguous() # 将b的存储空间转为连续
7、持久化
持久化:t.save(obj,file)
加载文件: a = t.load(file) # 也可以加载到CPU或其他GPU上