Pytorch60分钟学习笔记

最近准备实现GAN算法,比较了一下Google的Tensorflow和Facebook的Pytorch,最后决定还是使用Pytorch,并且打算以后也把Pytorch作为主力工具(比较有意思的是Pytorch的官方文档居然还用了Google colab作为教程练习环境)。本次笔记就从pytorch官网的一个60分钟入门教程入手,进行初步的学习。

What is Pytorch?

张量

官方教程一上来就抛出了张量(tensor) 的概念,看起来很高大上,查了资料后发现其实是很简单的数据结构:张量是基于向量和矩阵的推广。0维张量即为标量,是一个数字;1维张量可以理解为向量;2维张量可以理解为矩阵;3维张量可以理解为彩色图片、文本书籍、时间序列数据等等。(ps:黑白图片是二维张量!)

Autograd

这是在Pytorch中对于所有神经网络来说最核心的一个包。我的理解是对于每一个定义的张量都可以根据其历史自动计算其梯度。
开启的方式例如:

1
2
3
4
5
6
x = torch.ones(2, 2, requires_grad=True)#定义一个全1矩阵,设置跟踪计算
y = x + 2
z = y * y * 3
out = z.mean()
out.backward()
print(x.grad)

Neural Networks

构建神经网络可以使用torch.nn包。
文中指出,一个典型的神经网络的训练过程可以表示为:

  • 定义一个学习一些参数或权重的神经网络
  • 利用数据集作为输入进行迭代
  • 通过网络来处理输入
  • 计算损失
  • 将梯度反向传播给网络的参数
  • 更新网络的权重,一般使用一个经典的更新规则:weight = weight - learning_rate * gradient

文中给出了下面一段代码作为示例:
ps:感觉代码看着有点懵逼,卷积层、池化层什么的概念还很模糊,感觉需要整理一篇神经网络的笔记。

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
28
29
30
31
32
33
34
35
36
37
38
39
import torch
import torch.nn as nn #将nn包导入
import torch.nn.functional as F


class Net(nn.Module):

def __init__(self):
super(Net, self).__init__() #通过super调用父类中的方法
# 1 input image channel, 6 output channels, 3x3 square convolution
# kernel
self.conv1 = nn.Conv2d(1, 6, 3)
self.conv2 = nn.Conv2d(6, 16, 3)
# an affine operation: y = Wx + b
self.fc1 = nn.Linear(16 * 6 * 6, 120) # 6*6 from image dimension
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)

def forward(self, x):
# Max pooling over a (2, 2) window
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# If the size is a square you can only specify a single number
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(-1, self.num_flat_features(x))
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x

def num_flat_features(self, x):
size = x.size()[1:] # all dimensions except the batch dimension
num_features = 1
for s in size:
num_features *= s
return num_features


net = Net()
print(net)

0%