pytorch笔记02

  1. 1. pytorch自动微分
  2. 2. 激活函数
  3. 3. 加载数据
  4. 4. pytorch的使用

pytorch自动微分

torch.Tensor是包的核心类,有个属性.requires_grad设为True就会跟踪tensor所有操作。计算完成后调用backward()自动计算所有梯度。这个张量的梯度将累计到.grad属性中

调用.detach()可以与计算历史记录分离。

也可以用 with torch.no_grad(): 包起来。

Tensor当中有一个属性grad_fn用来记录创建了张量的Function引用。

1
2
3
import torch
x = torch.ones(2,2,requires_grad=True)
print(x)

out:

tensor([[1., 1.],
[1., 1.]], requires_grad=True)

做一次加法操作

1
2
3
4
import torch
x = torch.ones(2,2,requires_grad=True)
y = x + 2
print(y)

out

tensor([[3., 3.],
[3., 3.]], grad_fn=)

做更多操作

1
2
3
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当中,使用的时候引入即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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初始化为一些随机数。

1
2
3
4
5
6
7
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)

接下来,我们将输入数据通过模型的每一层做一次预测,这就是前向传播

1
prediction = model(data)

我们用模型的预测和对应的label去计算误差(loss). 下一步是对网络的误差进行反向传播。当我们调用误差tensor的.backward()的时候,反向传播开始。自动梯度接下来会为每个模型参数计算并存储梯度在参数的.grad属性

1
2
loss = (prediction - labels).sum()
loss.backward() # backward pass

下一步,我们加载一个优化器, 在这个例子用的SGD,学习率为0.01,动量为0.9,我们在这个优化器中注册模型的所有参数

1
optim = torch.optim.SGD(model.parameters(), lr=0.01, momentum= 0.9)

最终,我们调用.step()去初始化梯度下降。优化器通过存储在.grad中的梯度调整每一个参数

到这一步,你已经掌握了训练你的神经网络所需的所有东西。

这里官网教程往后是详细介绍梯度原理。求梯度原理请见深度学习入门笔记04