[关闭]
@nemos 2017-05-06T13:57:36.000000Z 字数 1967 阅读 1125

pytorch

ml


快速入门

  1. import torch

基础

张量

  1. x = torch.Tensor(5, 3)
  2. x.size() # 返回类元组对象

操作

所有改变变量的操作会有_后缀,如x.add_(y)

  1. x = torch.Tensor(2, 2)
  2. y = torch.Tensor(2, 2)
  3. z = x + y
  4. z = torch.add(x, y)
  5. torch.add(x, y, out=z)
  6. # 注意这样操作会改变y的值
  7. y.add_(x)

类numpy的一些接口

  1. x[:, 1] # 列索引
  2. x = torch.ones(5) # 初始化
  3. x.numpy() # 转化
  4. y = torch.from_numpy(x)

使用cuda

  1. if torch.cuda.is_available():
  2. x = x.cuda()
  3. y = y.cuda()
  4. x + y

梯度

  1. import torch
  2. from torch.autograd import Variable

Variable可视作Tensor封装的对象,包含三个部分。

  1. x = Variable(torch.ones(2, 2), requires_grad=True)
  2. y = x + 2
  3. z = y * y * 3
  4. out = z.mean()
  5. out.backward() # 反向求导
  6. x.grad # 返回梯度的tensor

注意只有调用了backward()之后x中才有梯度

网络

  1. import torch
  2. from torch.autograd import Variable
  3. import torch.nn as nn
  4. import torch.nn.functional as F
  5. import torch.optim as optim

定义

  1. class Net(nn.Module):
  2. # 定义层的结构
  3. def __init__(self):
  4. super(Net, self).__init__()
  5. self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
  6. self.conv2 = nn.Conv2d(6, 16, 5)
  7. self.fc1 = nn.Linear(in_features=16 * 5 * 5, out_features=120)
  8. self.fc2 = nn.Linear(120, 84)
  9. self.fc3 = nn.Linear(84, 10)
  10. # 前向计算
  11. def forward(self, x):
  12. x = F.max_pool2d(input=F.relu(input=self.conv1(x)),
  13. kernel_size=(2, 2))
  14. # 如果size是方形的,直接传边长即可
  15. x = F.max_pool2d(F.relu(self.conv2(x)), 2)
  16. # 扁平处理
  17. x = x.view(-1, self.num_flat_features(x))
  18. x = F.relu(self.fc1(x))
  19. x = F.relu(self.fc2(x))
  20. x = self.fc3(x)
  21. return x
  22. def num_flat_features(self, x):
  23. size = x.size()[1:] # 去掉batch的维度
  24. num_features = 1
  25. for s in size:
  26. num_features *= s
  27. # 返回单维的长度
  28. return num_features

训练

  1. net = Net() # 初始化
  2. # 随机生成一个输入和输出
  3. input = Variable(torch.randn(1, 1, 32, 32))
  4. target = Variable(torch.range(1, 10))
  5. # 计算输出
  6. out = net(input)
  7. net.zero_grad() # bp前先把参数清空并置0
  8. criterion = nn.MSELoss() # 平均均方误差
  9. loss = criterion(output, target)
  10. loss.backward()
  11. # 参数更新
  12. learning_rate = 0.01
  13. for f in net.parameters():
  14. f.data.sub_(f.grad.data * learning_rate)
  15. # 优化器
  16. optimizer = optim.SGD(net.parameters(), lr = 0.01)
  17. optimizer.zero_grad() # 等同net.zero_grad()
  18. optimizer.step() # 参数更新

结构

  1. print(net) # 显示网络结构
  2. params = list(net.parameters())
  3. print(len(params))
  4. params[0].size() # 第一层卷积权重的大小

实例


参考

官方文档-60分钟快速入门
等什么, 赶快抱紧 PyTorch 的大腿!
yunjey/pytorch-tutorial
新手如何入门pytorch
the-incredible-pytorch


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注