1. Tensor
1.1. 如何生成Tensor
- 构造函数
torch.FloatTensor(list/ndarray)
- 从numpy转换
torch.from_numpy(ndarray)
- 区别:
- 使用构造函数的方法
FloatTensor()
不与numpy数组共享内存,因此from_numpy()
的内存利用率更高 -
FloatTensor()
会生成torch.FloatTensor
类型数据,而from_numpy()
生成的tensor类型和参数相一致
- 使用构造函数的方法
1.2. 数据类型转换
We DO not recommend double for performance, especially on the GPU. GPUs have bad double precision perf and are optimized for float32 performance.参考 即不推荐使用DoubleTensor
-
tensor.float()
转换成浮点的tensor:torch.FloatTensor
- 值得注意的是: numpy的rand、linspace操作生成的默认生成
float64
数据(numpy用于科学计算目的是精确),如果使用from_numpy(float64_ndarray)
则会生成DoubleTensor
,这样是不推荐的; 而torch.rand/linspace会生成FloatTensor
性能会更好(torch更注重性能
, float精度在神经网络中完全够用)
1.3. 属性
1.4. 方法
1.4.1. 数学操作
- torch.mean(): 参数必须是
FloatTensor
2. Variable
2.1. Variable生成
仅仅可以传入Tensor
- Variable(tensor) # 不可以是ndarray之类
2.2. 属性
- grad 梯度
2.3. 方法
- backward() 反向传播
3. 示例代码
import numpy as np
import torch
from torch.autograd import Variable
np_data=np.arange(4,dtype=np.float).reshape(2,2)+1
print(np_data)
# [[1. 2.]
# [3. 4.]]
tensor=torch.from_numpy(np_data)
variable=Variable(tensor,requires_grad=True)
# variable=Variable(np_data,requires_grad=True) # 只能传入Tensor
t_out=variable*variable
out=torch.mean(t_out)
# 反响传播
out.backward()
v_grad=variable.grad
print(v_grad)
# tensor([[ 0.5000, 1.0000],
# [ 1.5000, 2.0000]], dtype=torch.float64)