记录一下自己学 pytorch,学习的资料为 pytorch 的中文文档,传送门:https://pytorch.apachecn.org/docs/1.4/blitz/tensor_tutorial.html
import torch
#创建一个没有初始化的 5*3 的矩阵
x = torch.empty(5, 3)
print(x)
#输出为:
tensor([[5.0977e-36, 0.0000e+00, 3.3631e-44],
[0.0000e+00, nan, 0.0000e+00],
[1.1578e+27, 1.1362e+30, 7.1547e+22],
[4.5828e+30, 1.2121e+04, 7.1846e+22],
[9.2198e-39, 7.0374e+22, 1.7243e-36]])
#创建一个随机初始化矩阵
x = torch.rand(5, 3)
print(x)
#输出为:
tensor([[0.5140, 0.5734, 0.9954],
[0.0649, 0.3278, 0.5843],
[0.6617, 0.2127, 0.0896],
[0.5640, 0.0474, 0.9199],
[0.9848, 0.9213, 0.0807]])
#构建一个填满 0 且数据类型为 long 的矩阵
x = torch.zeros(5, 3, dtype=torch.long) #long 代表64位整数
print(x)
#输出为:
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
#直接从数据构造张量
x = torch.tensor([5.5, 3])
print(x)
#输出为:
tensor([5.5000, 3.0000])
#或者根据已有的 tensor 建立新的 tensor。除非用户提供新的值,否则这些方法将重用输入张量的输入,如 dtype 等
x = x.new_ones(5, 3, dtype=torch.double)
print(x)
x = torch.randn_like(x, dtype=torch.float)
print(x)
#输出为:
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
tensor([[ 0.3767, 0.1459, 0.2180],
[ 0.1992, -0.3858, 0.2903],
[-0.0805, 0.4341, 0.0535],
[-1.0695, 1.2416, 2.7940],
[-0.5688, -0.2928, 1.5203]])
#获取张量的形状
print(x.size())
print(x.shape)
#输出为:
torch.Size([5, 3])
torch.Size([5, 3])
#运算
#一种运算有多种语法,在下面的示例中,我们将研究加法运算
#加法:形式一
y = torch.rand(5, 3)
print(x + y)
#加法:形式二
print(torch.add(x, y))
#加法:形式三/给定一个输出张量作为参数
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
#加法:形式四/原位,原地操作(in-place)
y.add_(x) #notes:任何一个in-place改变张量的操作后面都固定一个 _ 。如:x.copy_(y),x.t_(y)将更改x
print(y)
#输出为:
tensor([[ 1.0236, 0.3053, 1.0644],
[ 0.7069, 0.0373, 0.5393],
[ 0.2308, 1.3895, 0.7278],
[-0.8253, 2.0177, 3.7587],
[-0.4255, 0.5309, 1.8134]])
tensor([[ 1.0236, 0.3053, 1.0644],
[ 0.7069, 0.0373, 0.5393],
[ 0.2308, 1.3895, 0.7278],
[-0.8253, 2.0177, 3.7587],
[-0.4255, 0.5309, 1.8134]])
tensor([[ 1.0236, 0.3053, 1.0644],
[ 0.7069, 0.0373, 0.5393],
[ 0.2308, 1.3895, 0.7278],
[-0.8253, 2.0177, 3.7587],
[-0.4255, 0.5309, 1.8134]])
tensor([[ 1.0236, 0.3053, 1.0644],
[ 0.7069, 0.0373, 0.5393],
[ 0.2308, 1.3895, 0.7278],
[-0.8253, 2.0177, 3.7587],
[-0.4255, 0.5309, 1.8134]])
#也可以使用像标准的 Numpy 一样的各种索引操作:
print(x[:,1])
#输出为:
tensor([ 0.1459, -0.3858, 0.4341, 1.2416, -0.2928])
#改变形状:如果想改变形状,可以使用 torch.view
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)
print(x.size(), y.size(), z.size())
#输出为:
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
#如果是仅包含一个元素的 tensor,可以使用 .item() 来得到对应的 python 数值
x = torch.rand(1)
print(x)
print(x.item())
#输出为:
tensor([0.7128])
0.7128415107727051
#桥接 Numpy
#将一个 Torch 张量转换为一个 Numpy 数组是轻而易举的事情,反之亦然;
# Torch 张量和 Numpy 数组将共享它们的底层内存位置,因此当一个改变时,另外也会改变。
#将 torch 的 Tensor 转化为 Numpy 数组
a = torch.ones(5)
print(a)
b = a.numpy()
print(b)
a.add_(1)
print(a)
print(b) #这意味着改变 torch.tensor 的值,会同时改变其转化为 numpy 的值
#输出为:
tensor([1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
#将 Numpy 数组转化为 Torch 张量
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)
# CPU 上的所有张量(CharTensor除外)都支持与 Numpy 的相互转换
#输出为:
[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
# CUDA 上的张量
#张量可以使用 .to 方法移动到任何设备上:
#当 GPU 可用时,我们可以运行一下代码
#我们将使用 torch.device 来将 tensor 移入和移出 GPU
if torch.cuda.is_available():
device = torch.device("cuda")
y = torch.ones_like(x, device=device)
x = x.to(device)
z = x + y
print(z)
print(z.to("cpu", torch.double))
#输出为:
tensor([1.7128], device='cuda:0')
tensor([1.7128], dtype=torch.float64)
网友评论