基于pytorch,从零到实现CNN分类器并优化
前言
以下内容大部分翻译自pytorch
记录自己从零到实现CNN分类器所寻找的资源、学习过程
基础知识
学会Python的numpy包,numpy官网教程入口
Pytorch
介绍
- Pytorch是一个开源的深度学习平台,提供了从原型研究到生产部署的无缝衔接。
- 可替代Numpy(增强对GPU即图形处理器的使用)
- 一个深度学习的研究平台,具有最大的灵活性和速度
安装
不同版本/平台 Pytorch安装命令
Windows下利用pip安装pytorch1.0
pip install https://download.pytorch.org/whl/cu90/torch-1.0.1-cp36-cp36m-win_amd64.whl
pip install torchvision
开始学习Pytorch
这一大段学习自这里
导入包
import torch
tensor
torch包的数组类型,相当于list和numpy.array(…)
一些函数:
- torch.empty(x,y) 创建大小为X*Y的矩阵,这个矩阵是tensor类型的,初始化为0
- torch.rand(x,y)
- torch.zeros(5, 3, dtype=torch.long)
- torch.tensor([5.5, 3])
- torch.randn_like(x,dtype=torch.float) 创建一个大小和x相同的tensor
基础操作
加减乘除类似numpy,其他
假设x=torch.randn(4,4)
- x.view(…) 改变x的大小
- x.view(-1,8) //the size -1 is inferred from other dimensions,即-1的值可从其他维推出来
- x.item() 返回python原生类型的值
与Numpy类型相互转化
- b=torch.from_numpy(a) 将torch.tensor转化为numpy.array
- b=a.numpy() 将tensor转化为array
Autograd(自动求微分)
前言
官网链接
我看第一遍看不懂他在讲什么,第二遍还是不知道讲什么-_-||(我菜爆了)
于是乎,参考了以下文章点这里
(注:这篇文章里的creator已经被最近版本的pytorch换成了grad_fn)
看完这篇文章,然后我回过去看官网的文章
简述
为了实现autograd,需要使用Variable和Function这两种基本的数据类型
Variable类包括的属性如下:
属性名 | 解释 |
---|---|
data | 数据(存储着tensor类型的数据) |
grad | 梯度,即求出来的微分(导数)在data取值下的值 |
grad_fn | 可理解为函数表达式(是Function类型) |
autograd包的使用
- 开启tensor变量的自动求导功能
x.requires_grad=true
- 自动求微分
对最终的输出y进行操作
y.backward()
- 获取y关于x的导数在x取值下的值
x.grad
- 禁止变量继续追踪计算历史
x.detach()
或者
with torch.no_grad():
....
官网中有提到雅可比不等式,不是很懂,先不深究,以后要用再看
神经网络
前言
这里需要一些机器学习和深度学习(CNN卷积神经网络)的知识,
- 机器学习的课程,推荐吴恩达的网课,网易云课堂入口
原版的是coursera网站上的,只不过coursera是英文的,而网易云课堂有翻译 - CNN:第一个博客入口
第二个博客入口 - CNN中特征图/通道的概念:
特征图:博客入口
通道:博客入口
简述
所需包:
import torch.nn
- nn基于autograd去区分每个神经网络
- nn.Module包含神经网络的layers
- nn.forward(input)返回output
这是一个典型的前馈(feed_forward)神经网络,即 输入数据-经过不同的层处理-产生输出
神经网络基本训练过程
- 定义一个有可学习参数(或称权重)的神经网络
- 在数据集上迭代输入
- 在神经网络中处理输入
- 计算损失loss
- 将梯度(gradients)反向传播回神经网络的参数
- 更新神经网络的权重,一个基本的更新公式是
w e i g h t = w e i g h t − l e a r n i n g _ r a t e ∗ g r a d i e n t weight = weight - learning\_rate * gradient weight=weight−learning_rate∗gradient
定义神经网络(注释官网的代码)
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__() #调用Net父类(nn.Module)的__init__()方法
# 1 input image channel, 6 output channels, 5x5 square convolution
# kernel
self.conv1 = nn.Conv2d(1, 6, 5) #表
self.conv2 = nn.Conv2d(6, 16, 5)
# an affine operation: y = Wx + b
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self