pytorch入门笔记02

pytorch自动微分

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入门笔记02_第1张图片

加载数据

使用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的使用

个人翻译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

你可能感兴趣的:(深度学习,pytorch,深度学习,机器学习)