深度学习:基于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卷积神经网络)的知识,

简述

所需包:

import torch.nn

  • nn基于autograd去区分每个神经网络
  • nn.Module包含神经网络的layers
  • nn.forward(input)返回output
    典型的CNN神经网络
    这是一个典型的前馈(feed_forward)神经网络,即 输入数据-经过不同的层处理-产生输出

神经网络基本训练过程

  1. 定义一个有可学习参数(或称权重)的神经网络
  2. 在数据集上迭代输入
  3. 在神经网络中处理输入
  4. 计算损失loss
  5. 将梯度(gradients)反向传播回神经网络的参数
  6. 更新神经网络的权重,一个基本的更新公式是
    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=weightlearning_rategradient

定义神经网络(注释官网的代码)

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
  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值