Tensors
Tensors与Numpy中的ndarrays类似
torch.new_* 与 torch.*_like
前者创建的对象会保持原有的属性(如dtype),但shape不同
>>> x = torch.zeros(5, 3, dtype=torch.double)
>>> x.new_ones(2, 3)
tensor([[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
>>> x.new_ones(2, 3, dtype=torch.long)
tensor([[1, 1, 1],
[1, 1, 1]])
后者可以创建shape相同,属性不同的对象
>>> x = torch.zeros(5, 3, dtype=torch.double)
>>> torch.ones_like(x)
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
>>> torch.ones_like(x, dtype=torch.long)
tensor([[1, 1, 1],
[1, 1, 1],
[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
获得size
使用size方法与Numpy的shape属性返回的相同,张量也支持shape属性
>>> x = torch.zeros(5, 3, dtype=torch.double)
>>> x.size()
torch.Size([5, 3])
torch.Size
实际上是一个tuple元组,因此它支持所有元组操作。
操作
加法
有多种操作方式:
x + y
torch.add(x, y)
- 提供输出tensor作为参数
result = torch.empty(5, 3)
torch.add(x, y, out=result)
y.add_(x)
将x加到y中
任何 以
_
结尾的操作都会用结果替换原变量. 例如:x.copy_(y)
,x.t_()
, 都会改变x
.
索引
可以使用与NumPy索引方式相同的操作来进行对张量的操作,如x[:, 1]
得到x的第1列
torch.view
可以改变张量的维度和大小,与Numpy的reshape类似
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) # size -1 从其他维度推断
print(x.size(), y.size(), z.size())
# Output:
# torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
.item()
如果你有只有一个元素的张量,使用.item()
来得到Python数据类型的数值
x = torch.randn(1)
print(x)
print(x.item())
# Output:
# tensor([-0.2368])
# -0.23680149018764496
NumPy转换
Torch Tensor与NumPy数组共享底层内存地址,修改一个会导致另一个的变化。
Tensor -> NumPy
a = torch.ones(5)
b = a.numpy()
print(b) # [1. 1. 1. 1. 1.]
a.add_(1)
print(a) # tensor([2., 2., 2., 2., 2.])
print(b) # [2., 2., 2., 2., 2.]
NumPy -> Tensor
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a) # [2. 2. 2. 2. 2.]
print(b) # tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
所有的 Tensor 类型默认都是基于CPU, CharTensor 类型不支持到 NumPy 的转换.
CUDA 张量
使用.to
方法 可以将Tensor移动到任何设备中
# is_available 函数判断是否有cuda可以使用
# ``torch.device``将张量移动到指定的设备中
if torch.cuda.is_available():
device = torch.device("cuda") # a CUDA 设备对象
y = torch.ones_like(x, device=device) # 直接从GPU创建张量
x = x.to(device) # 或者直接使用``.to("cuda")``将张量移动到cuda中
z = x + y
print(z)
print(z.to("cpu", torch.double)) # ``.to`` 也会对变量的类型做更改