torch.Tensor是包的核心类,有个属性.requires_grad设为True就会跟踪tensor所有操作。计算完成后调用backward()自动计算所有梯度。这个张量的梯度将累计到.grad属性中
调用.detach()可以与计算历史记录分离。
也可以用 with torch.no_grad(): 包起来。
Tensor当中有一个属性grad_fn用来记录创建了张量的Function引用。
import torch
x = torch.ones(2,2,requires_grad=True)
print(x)
out:
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
做一次加法操作
import torch
x = torch.ones(2,2,requires_grad=True)
y = x + 2
print(y)
out
tensor([[3., 3.],
[3., 3.]], grad_fn=)
做更多操作
z = y * y * 3
out = z.mean()
print(z,out)
out:
tensor([[27., 27.],
[27., 27.]], grad_fn=) tensor(27., grad_fn=)
pytorch中的激活函数所在的位置是 torch.nn.functional当中,使用的时候引入即可
import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F
#假数据
# x -5~5之间取200个
x = torch.linspace(-5,5,200)
x_np = x.numpy()
y_relu = F.relu(x).numpy()
y_sigmoid = torch.sigmoid(x).numpy()
plt.subplot(221)
plt.plot(x_np,y_relu,c='red',label='relu')
plt.subplot(222)
plt.plot(x_np,y_sigmoid,c='red',label='sigmoid')
plt.show()
使用pytorch中的utils.data
import torch.utils.data as Data
# 新版的TensorDataset(*Tensor) 当中是可以填写多个Tensor的
# 旧版的TensorDataset(data_tensor=, target_tensor= )
# 其中填写的是数据和标签,相当于是打包起来
torch_dataset = Data.TensorDataset(x_train,t_train)
# dataloader,负责的是按批加载pytorch张量
# 就是和深度学习入门那本书里讲的minibatch是一样的,参数就是填dataset数据集,batchsize每个批次是多少个,shuffle是否打乱
loader = Data.DataLoader(dataset=torch_dataset,
batch_size=batch_size,
shuffle=True
)
# 每次获得的批次使用
for step, (batch_x,batch_y) in enumerate(loader):
# 设定自动微分
batch_x.requires_grad = True
# 转到GPU中计算
batch_y.cuda()
batch_x.cuda()
# 获得预测值
prediction = network(batch_x)
# 交叉熵
loss = F.cross_entropy(prediction,batch_y.long())
# 反向传播 optimizer为梯度下降
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss_list.append(loss.item())
个人翻译pytorch官网60min教程
让我们看一下单词训练。 比如, 我们从torchvision中加载一个预训练resnet18模型。我们创建一个随机tensor数据去代表一个有3通道,高和宽都是64的图像,它对应的label初始化为一些随机数。
import os
import torch, torchvision
os.environ['TORCH_HOME'] = 'F:/WorkSpace/tensorflow/pytorch/models'
model = torchvision.models.resnet18(pretrained=True)
data = torch.rand(1, 3, 64, 64)
labels = torch.rand(1, 1000)
接下来,我们将输入数据通过模型的每一层做一次预测,这就是前向传播
prediction = model(data)
我们用模型的预测和对应的label去计算误差(loss). 下一步是对网络的误差进行反向传播。当我们调用误差tensor的.backward()的时候,反向传播开始。自动梯度接下来会为每个模型参数计算并存储梯度在参数的.grad属性
loss = (prediction - labels).sum()
loss.backward() # backward pass
下一步,我们加载一个优化器, 在这个例子用的SGD,学习率为0.01,动量为0.9,我们在这个优化器中注册模型的所有参数
optim = torch.optim.SGD(model.parameters(), lr=0.01, momentum= 0.9)
最终,我们调用.step()去初始化梯度下降。优化器通过存储在.grad中的梯度调整每一个参数
到这一步,你已经掌握了训练你的神经网络所需的所有东西。
这里官网教程往后是详细介绍梯度原理。求梯度原理请见深度学习入门笔记04