1 什么是张量
张量是一个多维数组,他是标量、向量、矩阵的高维拓展
2 Tensor与Variable
2.1Variable
Variable
是torch.autograd
中的数据类型,主要用于封装Tensor
,进行自动求导
-
data
: 被包装的Tensor
-
grad
:data
的梯度 -
grad_fn
: 创建Tensor
的Function,是自动求导的关键 -
requires_grad
: 指示是否梯度 -
is_leaf
: 指示是否为叶子节点(张量)
2.2 Tensor
PyTorch
从0.4.0
版本开始,Variable
并入Tensor
,总共8个参数,上面四个与数据有关,下面四个与梯度有关
-
dtype
:张量的数据类型,如torch.FloatTensor
,torch.cuda.FloatTensor
-
shape
: 张量的形状,如(64,3, 224, 224)
-
device
: 张量所在设备,GPU/CPU
,是加速的关键
3 张量的三种创建方法
3.1 直接创建
-
torch.tensor()
输入:
import torch
import numpy as np
Flag = False
# ===================== example 1 =============================
# 通过torch.tensor创建张量
Flag = True
if Flag:
arr = np.ones((3, 3))
print("ndarray的数据类型:", arr.dtype)
# t = torch.tensor(arr)
t = torch.tensor(arr, device='cuda')
print(t)
输出:
ndarray的数据类型: float64
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], device='cuda:0', dtype=torch.float64)
Process finished with exit code 0
-
torch.from_numpy()
注意:使用它创建的tensor和原np共享内存,修改其中一个另外一个也会变化
输入:
# ===================== example 2 =============================
# 通过torch.from_numpy创建张量
Flag = True
if Flag:
arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)
print("NDarray:", arr)
print("Tensor:", t)
print("\n")
print("修改arr中的数据:")
arr[0, 0] = 888
print("NDarray:", arr)
print("Tensor:", t)
print("\n")
print("修改tensor中的数据:")
t[0, 1] = 999
print("NDarray:", arr)
print("Tensor:", t)
print("\n")
输出:
NDarray: [[1 2 3]
[4 5 6]]
Tensor: tensor([[1, 2, 3],
[4, 5, 6]], dtype=torch.int32)
修改arr中的数据:
NDarray: [[888 2 3]
[ 4 5 6]]
Tensor: tensor([[888, 2, 3],
[ 4, 5, 6]], dtype=torch.int32)
修改tensor中的数据:
NDarray: [[888 999 3]
[ 4 5 6]]
Tensor: tensor([[888, 999, 3],
[ 4, 5, 6]], dtype=torch.int32)
3.2 依据数值创建张量
-
tensor.zeros()
注意:其中参数out的作用就是进行赋值
输入:
# ===================== example 3 =============================
# 通过torch.zeros创建张量
# Flag = True
if Flag:
out_t = torch.tensor([1])
t = torch.zeros((3, 3), out=out_t) # 将生成的张量赋给out
print(t, "\n", out_t)
print(id(t), id(out_t), id(t)==id(out_t))
输出:
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
2585763895552 2585763895552 True
- tensor.full()
输入:
# ===================== example 4 =============================
# 通过torch.full创建张量
Flag = True
if Flag:
t = torch.full((3, 3), 10)
print(t)
输出:
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
2585763895552 2585763895552 True
tensor([[10., 10., 10.],
[10., 10., 10.],
[10., 10., 10.]])
- torch.zeros(),创建全为0的张量
- torch.arange(),创建等差数列