日期:2020.10.29
主题:PyTorch入门
内容:
-
根据PyTorch官方教程文档,学习PyTorch基础操作(主要与张量相关)。
-
根据自己的理解和试验,为代码添加少量注解。
具体代码如下 ↓
from __future__ import print_function
import torch
import numpy as np
# {入门}
# 【张量】
# 创建一个没有初始化的5*3矩阵
x = torch.empty(5, 3)
print(x)
# 创建一个随机初始化矩阵
x = torch.rand(5, 3)
print(x)
# 构造一个填满0且数据类型为long的矩阵
x = torch.zeros(5, 3, dtype=torch.long)
print(x)
print('-'*40)
# 直接从数据构造张量
x = torch.tensor([5.5, 3])
print(x)
print('-'*40)
# 根据已有的tensor建立新的tensor。
# 除非用户提供新的值,否则这些方法将重用输入张量的属性,例如dtype等。
x = x.new_ones(5, 3, dtype=torch.double) # new_* methods take in sizes
print(x)
x = torch.randn_like(x, dtype=torch.float) # 重载 dtype!
print(x) # 结果size一致
# 获取张量的形状
print(x.size()) # torch.Size本质上还是tuple,支持tuple的一切操作。
print('-'*40)
# 【运算】
# 加法:形式一
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) # 任何一个in-place改变张量的操作后面都固定一个_。例如x.copy_(y)、x.t_()将更改x
print(y)
print('-'*40)
# 像标准的NumPy一样的各种索引操作
print(x[:, 1]) # 输出第1列元素
print('-'*40)
# 改变形状
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) # the size -1 is inferred from other dimensions
w1 = x.view(-1) # x.view(-1)把x降维成一维向量
w2 = x.view(-1, 2) # x.view(-1, 2)先降维,后按2个元素为一组的方式分配
print(x.size(), y.size(), z.size(), w1.size(), w2.size())
# 仅包含一个元素的tensor,可以使用.item()来得到对应的python数值
x = torch.randn(1)
print(x)
print(x.item())
# {桥接 NumPy}
# Torch张量和NumPy数组将共享它们的底层内存位置,同步变化
# 将torch的Tensor转化为NumPy数组
a = torch.ones(5)
print(a)
b = a.numpy()
print(b)
a.add_(1)
print(a)
print(b)
print('-'*40)
# 将NumPy数组转化为Torch张量
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)
# CPU上的所有张量(CharTensor除外)都支持与Numpy的相互转换。
# {CUDA上的张量}
# 张量可以使用.to方法移动到任何设备(device)上
# 当GPU可用时,我们可以运行以下代码
# 我们将使用`torch.device`来将tensor移入和移出GPU
if torch.cuda.is_available():
device = torch.device("cuda") # a CUDA device object
y = torch.ones_like(x, device=device) # 直接在GPU上创建tensor
x = x.to(device) # 或者使用`.to("cuda")`方法
z = x + y
print(z)
print(z.to("cpu", torch.double)) # `.to`也能在移动时改变dtype