欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深入浅出Pytorch打卡二

程序员文章站 2022-06-21 15:06:25
...
import torch
?torch.tensor # ? + 想查找到函数即可展示它的定义信息,这是jupyter notebook的特别功能,jupyter利于可视化展示

# 创建tensor,用dtype指定类型,注意类型匹配!!!
a = torch.tensor(1.0, dtype = torch.float) # dtype即default type
b = torch.tensor(1, dtype = torch.long)
c = torch.tensor(1.0, dtype = torch.int8) # 类型不匹配!!!
print(a, b, c)

# 使用指定类型的函数随机初始化指定大小的tensor
d = torch.FloatTensor(2, 3)
e = torch.IntTensor(2)
f = torch.IntTensor([1, 2, 3, 4])
print(d, '\n', e, '\n', f)

# tensor和numpy array之间的互相转换。
# tensor专门为机器学习而设计,可以求导、支持GPU、并行计算等;而numpy array用于科学计算
import numpy as np
g = np.array([[1, 2, 3],[4, 5, 6]])
h = torch.tensor(g)
print(h)
i = torch.from_numpy(g)
print(i)
j = h.numpy()
print(j)

# 常见的构造tensor的函数
k = torch.rand(2, 3)
l = torch.ones(2, 3)
m = torch.zeros(2, 3)
n = torch.arange(0, 10, 2) # [0, 10)每隔2取一个数
print(k, '\n', l, '\n', m, '\n', n)

# 查看tensor的维度信息(两种方式)
print(k.shape)
print(k.size())

# tensor的运算
o = torch.add(k, 1)
print(o)

# tensor的索引和numpy类似
print(o[:, 1])
print(o[1, :])

# 改变tensor形状的神器:view / reshape
print(o.view(3, 2))
print(o.view(-1, 3)) # -1表示自动计算该维度

# tensor的广播机制,这里要注意,容易出错!!!
p = torch.arange(1, 3).view(1, 2)
print(p)
q = torch.arange(1, 4).view(3, 1)
print(q)
print(p + q) # tensor会自动扩维来匹配计算

# 扩展或压缩tensor维度:squeeze。
# 这可以用来匹配维度
print(o)
r = o.unsqueeze(1)
print(r)
print(r.shape)

s = r.squeeze(0) # 只能缩维度为1的维度!!!
print(s)
print(s.shape)

s = r.squeeze(1)
print(s)
print(s.shape)

t = torch.arange(0, 20).reshape(4, 5) # view也可以,但是形状必须匹配前面数值的范围
print(t)
u = t.sum()
print(u)
v = torch.sum(t, dim = 1, keepdim = True) # dim = 0是对列求和,保留行;dim = 1是对行求和,保留列;keepdim是保留维度形状
print(v)

# 自动求导示例

import torch

x1 = torch.tensor(1.0, requires_grad = True)
x2 = torch.tensor(2.0, requires_grad = True)

y = x1 + 2 * x2

# 首先查看每个变量是否需要求导
print(x1.requires_grad)
print(x2.requires_grad)
print(y.requires_grad)

# 查看每个变量导数大小。此时还未反向传播,因此导数不存在
print(x1.grad.data)
print(x2.grad.data)
print(y.grad.data)

# 反向传播后看导数大小
y = x1 + 2 * x2
y.backward() # 导数是会累积的,如果不清零,每次计算都会加上上次的导数
print(x1.grad.data)
print(x2.grad.data)

# 尝试不允许求导,会出现什么情况?
x1 = torch.tensor(1.0, requires_grad = False)
x2 = torch.tensor(2.0, requires_grad = False)
y = x1 + 2 * x2
y.backward()