II.Pytorch 基本语法
最编程
2024-10-01 06:58:13
...
2.1 Pytorch的基本元素操作
# 创建一个没有初始化的矩阵
x = torch.empty(5,3)
print(x)
内存中存在脏数据
# 创建一个有初始化矩阵
x = torch.rand(5,3)
x
从均匀分布(范围通常是 [0, 1))中生成随机数
x = torch.randn(5,3)
x
均值为0方差为1的矩阵
torch.randint(0,10,(3,3))
# 创建⼀个全零矩阵
torch.zeros(5,3)
# 直接通过数据创建张量
torch.tensor([2.5,3.5])
# 在已有张量上创建一个新张量
x = x.new_ones(5,3)
print(x)
y = torch.rand_like(x)
print(y)
# 张量尺寸
x.size()
# 将x中的值取出
# 如果张量中只有一个元素可以直接用.item()取出
for i in range(x.size(0)):
for j in range(x.size(1)):
print(x[i][j].item())
2.2 Pytorch的基本运算操作
# 加法操作
y = torch.rand(5,3)
print(x+y)
torch.add(x,y)
result = torch.empty(5,3)
torch.add(x,y,out=result)
result
# 不赋值给y
y.add(x)
y
# 赋值给y
y.add_(x)
y
# 支持切片操作
y[:,1]
# 改变张量形状
x = torch.rand(2,6)
y = x.view(12)
z = x.view(3,4)
# -1表示自动匹配个数
p = x.view(6,-1)
print(x.size(),y.size(),z.size(),p.size())
2.3 Torch Tensor和Numpy array之间的相互转换
a = torch.ones(5)
a
# 将Torch tensor转换为Numpy array
b = a.numpy()
b
# tensor 和 array 共享底层内存空间,一个改变另一个也会改变
a.add_(1)
a,b
a = np.ones(5)
# # 将Numpy array转换为Torch tensor
b = torch.from_numpy(a)
np.add(a,1,out=a)
a,b
2.4 Pytorch中的autograd
# requires_grad=True计算梯度
x = torch.ones(2,2,requires_grad=True)
x
# 自动继承requires_grad=True这个属性
y = x + 2
y
# grad_fn记录了张量是如何通过各种操作生成的。
# None因为x是手动创建的,AddBackward0表示y是通过加法操作创建的
x.grad_fn,y.grad_fn
z = y * y * 3
out = z.mean()
z,out
a = torch.rand(2,2)
a = (a * a) / (a - 1)
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
b.grad_fn
# 关于梯度Gradients
x = torch.tensor([[1.0, 2.0], [3.0, 4.0]], requires_grad=True)
y = x * x
out = y.sum()
# 反向传播
out.backward()
print("x.grad:", x.grad)
x = torch.rand(2,2,requires_grad=True)
x
# 获得一个新的Tensor,跟x拥有相同的内容但不需要自动求导
y = x.detach()
y.requires_grad
# 查看x和y元素是否相同
x.eq(y)
x.eq(y).all()