四、创建数据
Tensors张量是一种特殊的数据结构,它和数组还有矩阵十分相似。在Pytorch中,Tensors可以在gpu或其他专用硬件上运行来加速计算之外,其他用法类似Numpy。
import torch
import numpy as np
#直接从数据创建
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
x_data.shape
#全为1
x_ones = torch.ones_like(x_data) # retains the properties of x_data
print(f"Ones Tensor: \n {x_ones} \n")
#全为0
x_rand = torch.rand_like(x_data, dtype=torch.float) # overrides the datatype of x_data
print(f"Random Tensor: \n {x_rand} \n")
#查看tensor类型
tensor = torch.rand(3, 4)
print(f"Shape of tensor: {tensor.shape}“)
print(f"Datatype of tensor: {tensor.dtype}”)
print(f"Device tensor is stored on: {tensor.device}")
步骤2:自动梯度计算
在Pytorch中可以使用tensor进行计算,并最终可以从计算得到的tensor计算损失,并进行梯度信息。在Pytorch中主要关注正向传播的计算即可。
#x = torch.ones(2, 2, requires_grad=True)
x = torch.tensor([[1, 2], [3, 4]], dtype=float, requires_grad=True)
print(x)
y = x + 2
print(y)
print(y.grad_fn) # y就多了一个AddBackward
z = y * y * 3
out = z.mean()
print(z) # z多了MulBackward
print(out) # out多了MeanBackward
#计算公式:out = 0.25 ((x+2) * (x+2) * 3)
out.backward()
print(x.grad)
步骤3:拟合曲线
接下来我们将尝试使用Pytorch拟合一条曲线,我们首先的创建待你和的参数,并加载待训练的数据。
#需要计算得到的参数
w = torch.ones(1, requires_grad=True)
b = torch.ones(1, requires_grad=True)
#数据
x_tensor = torch.from_numpy(x)
y_tensor = torch.from_numpy(y)
#目标模型
#y = wx + b
定义损失
def mse(label, pred):
diff = label - pred
return torch.sqrt((diff ** 2).mean())
pred = x_tensor * w + b
loss = mse(y_tensor, pred)
#执行20次参数更新
for _ in range(20):
# 重新定义一下,梯度清空
w = w.clone().detach().requires_grad_(True)
b = b.clone().detach().requires_grad_(True)
# 正向传播
pred = x_tensor * w + b
# 计算损失
loss = mse(y_tensor, pred)
print(loss)
# 计算梯度
loss.backward()
五、完整代码(GPU)
使用GPU训练只需要把训练数据、模型放入GPU中即可
指定是否使用GPU训练模型
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")