张量(Tensor)是线性代数中的一种数据结构,是向量和矩阵的推广,我们可以在张量上进行算术运算。Tensors 类似于 NumPy 的 ndarrays ,同时 Tensors 可以使用 GPU 进行计算
判断是否是张量
import torch var_1 = 1 print(torch.is_tensor(var_1)) # False
属性 | 描述 | ||
---|---|---|---|
tensor.data |
存储的数据 | ||
tensor.type() |
有括号,其他的没有 | ||
tensor.shape |
|||
tensor.device |
|||
tensor.requires_grad |
|||
tenor.grad |
type | CPU | GPU | |
---|---|---|---|
torch.float32 |
torch.FloatTensor |
torch.cuda.FloatTensor |
|
torch.float64 |
torch.DoubleTensor |
torch.cuda.DoubleTensor |
|
torch.float16 |
torch.HalfTensor |
torch.HalfTensor |
|
torch.uint8 |
torch.ByteTensor |
torch.cuda.ByteTensor |
|
torch.int8 |
torch.CharTensor |
torch.cuda.CharTensor |
|
torch.int16 |
torch.ShortTensor |
torch.cuda.ShortTensor |
|
torch.int32 |
torch.IntTensor |
torch.cuda.IntTensor |
|
torch.int64 |
torch.LongTensor |
torch.cuda.LongTensor |
|
torch.bool |
torch.BoolTensor |
torch.cuda.BoolTensor |
torch.type()
t1 = torch.LongTensor(3, 5) print(t1.type()) # 转换为其他类型 t2=t1.type(torch.FloatTensor) print(t2.type()) torch.LongTensor torch.FloatTensor
type_as()
t1=torch.Tensor(2,3) t2=torch.IntTensor(3,5) t3=t1.type_as(t2) print(t3.type()) torch.IntTensor
torch.set_default_tensor_type(torch.FloatTensor) torch.get_default_dtype() # torch.float32
import torch tensor = torch.randn(2, 2) print(tensor.type()) # torch.long() 将tensor转换为long类型 long_tensor = tensor.long() print(long_tensor.type()) # torch.half()将tensor转换为半精度浮点类型 half_tensor = tensor.half() print(half_tensor.type()) # torch.int()将该tensor转换为int类型 int_tensor = tensor.int() print(int_tensor.type()) # torch.double()将该tensor转换为double类型 double_tensor = tensor.double() print(double_tensor.type()) # torch.float()将该tensor转换为float类型 float_tensor = tensor.float() print(float_tensor.type()) # torch.char()将该tensor转换为char类型 char_tensor = tensor.char() print(char_tensor.type()) # torch.byte()将该tensor转换为byte类型 byte_tensor = tensor.byte() print(byte_tensor.type()) # torch.short()将该tensor转换为short类型 short_tensor = tensor.short() print(short_tensor.type()) torch.FloatTensor torch.LongTensor torch.HalfTensor torch.IntTensor torch.DoubleTensor torch.FloatTensor torch.CharTensor torch.ByteTensor torch.ShortTensor
tensor
import torch double_points = torch.ones((10, 2), dtype=torch.double) short_points = torch.tensor([[1,2],[3,4]], dtype=torch.short)
tensor.type()
tenor=torch.tensor([1,2,3]).type() torch.set_default_tensor_type(torch.FloatTensor) tenor2=torch.tensor([1.2, 3]).type() print(tenor) print(tenor2) torch.LongTensor torch.FloatTensor
3种方式
import torch # (1)直接在tensor后面接.dtype()进行转换 double_points = torch.zeros(10,2).double() # (2)使用to进行转换 double_points = torch.zeros(10,2).to(torch.double) # (3)使用type()进行转换 double_points = torch.zeros(10,2).type(torch.short)
torch.tensor(data)
data
可以是list
, numpy
torch.tensor( data, dtype=None, device=None, requires_grad=False, pin_memory=False) """ data就是张量中存储的数据,可以是list,numpy; dtype数据类型默认和data一致; device所在设备(cuda or cpu); requires_grad是否需要计算梯度 """ import torch import numpy as np # 创建numpy数据 arry = np.ones((3,3)) print("array的数据类型:",arry.dtype) # 创建tensor t = torch.tensor(arry) print(t) # -------------------------------------------------------------- tensor([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]], dtype=torch.float64)
torch.from_numpy(ndarray)
tensor
和ndarray
是共享内存的,当修改一个数据时另一个数据也会随之改变
import torch import numpy as np # 创建numpy数据 arry = np.array([[1,2,3],[4,5,6]]) print("numpy:",arry) # 创建tensor t = torch.from_numpy(arry) print("tensor:",t) # 测试共享内存 arry[0][0] = 10 print("numpy:",arry) print("tensor:",t) # -------------------------------------------------------- numpy: [[1 2 3] [4 5 6]] tensor: tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.int32) numpy: [[10 2 3] [ 4 5 6]] tensor: tensor([[10, 2, 3], [ 4, 5, 6]], dtype=torch.int32)
torch.as_tensor(data)
torch.as_tensor()
和torch.from_numpy()
原生的numpy
数组共享内存
import torch a = np.array([1, 2, 3]) t_1 = torch.as_tensor(a) print(t1) a[[0,1,2]] = 0 print(t1) # ---------------------------------------------------- tensor([1, 2, 3], dtype=torch.int32) array([0, 0, 0])
tensor.tolist()
tenor_rand = torch.randn(2,3) print(tenor_rand) print(tenor_rand.tolist()) print(type(tenor_rand.tolist())) # tensor([[-0.3383, 0.4823, 0.3448], # [ 0.2380, 0.1300, -0.1907]]) # [[-0.3383448123931885, 0.482287734746933, 0.34484198689460754], # [0.23801031708717346, 0.12998750805854797, -0.19072400033473969]] # <class 'list'>
tensor.numpy()
tenor_rand = torch.randn(2,3) print(tenor_rand.numpy()) print(type(tenor_rand.numpy())) # [[ 1.6192089 -0.7044066 0.8276266 ] # [-0.10407448 0.11350407 -0.9923446 ]] # <class 'numpy.ndarray'>
函数 | 描述 | ||
---|---|---|---|
torch.zeros(size) |
创建全为0的张量 | ||
torch.zeros_like(input) |
创建和input一样大小的全0张量 | ||
torch.ones(size) |
创建全1张量 | ||
torch.ones_like(input) |
创建和input一样大小的全1张量 | ||
torch.full(size, fill_value) |
创建全”full_value“张量 | ||
torch.full_like(input,fill_value) |
|||
torch.eye(n,m) |
创建单位对角矩阵(二维张量),默认为方阵 | n:矩阵行数 m: 矩阵列数。 | |
torch.arange (start=0, end, step=1) |
创建等差的一维张量,数值区间为[ start, end ) | ||
torch.linspace(start, end, steps) |
创建均分的一维张量,数值区间为[start, end] | steps:生成的样本数 | |
torch.logspace(start, end, steps) |
|||
使用方式基本和numpy类似
torch.manual_seed() |
随机种子 | |
torch.rand(size) |
区间[0, 1)的均匀分布 float |
|
torch.randn(size) |
均值为0,方差为1,标准正态分布 float |
|
torch.normal(means, std, out=None) |
指定均值means 和标准差std 的离散正态分布 |
|
torch.randint(low,high,size) |
在区间[low,high) 上,生成整数均匀分布 |
|
torch.randperm(n) |
生成从0 到n-1 的随机排列 |
|
torch.bernoulli(input) |
以input 为概率,生成伯努利分布(0-1分布,两点分布) |
import torch rand = torch.rand(2, 3) # 返回一个张量,包含了从区间[0,1)的均匀分布中抽取的一组随机数 print(rand) # 随机初始化的值在 [0,1) 之间 # tensor([[0.5047, 0.8442, 0.1771], # [0.3896, 0.5468, 0.9686]]) # torch.rand_like() #--------------------------------------------------------------------------- randn = torch.randn(2, 3) # 返回一个张量,包含了从标准正态分布(均值为0,方差为 1,即高斯白噪声)中抽取一组随机数 print(randn) # tensor([[ 0.0539, 0.8289, -1.6746], # [-1.7428, 0.6285, 0.1432]]) # torch.randn_like() #-------------------------------------------------------------------------- randint_01 = torch.randint(3, 5, (3,)) print(randint_01) # tensor([3, 4, 3])