zoukankan      html  css  js  c++  java
  • 56 Marvin: 一个支持GPU加速、且不依赖其他库(除cuda和cudnn)的轻量化多维深度学习(deep learning)框架介绍

    0 引言

    Marvin是普林斯顿视觉实验室(PrincetonVision)于2015年提出的轻量化GPU加速的多维深度学习网络框架。该框架采用纯c/c++编写,除了cuda和cudnn以外,不依赖其他库,编译非常简单,功能也相当强大,用于深度神经网络的快速原型开发非常好用。缺点在于没有提供API,所有的代码集中在marvin.hpp一个文件中,读起来非常困难。好在提供了视频格式的PPT,对框架和代码进行解读。下面将基于官网视频/ppt对该框架进行介绍。

    1 相关链接

    不想看我翻译的同学可以直接参考下面的链接,里边包含了我下面将要讲到的所有知识。

    官网:                         http://marvin.is/
    github:                       https://github.com/PrincetonVision/marvin
    基于Marvin搭建的应用3DMatch:    https://github.com/andyzeng/3dmatch-toolbox

    2 为什么要用Marvin

    深度学习的框架千千万,包括caffe,tensorflow,keras,pytorch等,为啥一定要试试Marvin呢?用过caffe的同学知道,caffe的配置分分钟让一个正常的少男少女抓狂;tensorflow则包含两个版本,而且不向下兼容,跑前一个版本的代码颇为费劲,还要去改源码;keras集成了tensorflow等框架,封装严密,这种框架上手一时爽,但出了bug调试起来就很难找到原因。其他的不一一分析了。相比而言,Marvin有一下几个优点。

    (1)依赖项极少,就俩,CUDA 7.5 and cuDNN 5.1

    (2)编译方便,./compile.sh就完事了

    (3)模型框架描述清晰,模型采用.json文件描述,类似于caffe的.prototxt文件,搭建或者修改起来都极为方便

    (4)运行速度快,在GPU计算方面进行了优化,可显著节省显存

    (5)支持多种型号的GPU

    (6)跨平台,支持Windows,Mac,Linux等

    3 模型的训练过程介绍

    (1)可以用下面这个公式简单解释一下,即训练的目的是通过迭代法不断调整权重(weights)参数使损失函数(loss)收敛/最小化

                               

    (2)训练的基本原理是利用梯度下降法(gradient descent),不断更新权重参数, 通常采用直接梯度下降法随机梯度下降法来训练

                               

    (3)训练的迭代步骤如下

      1 随机采样小样本批次

      2 前向传播 (forward) 计算响应

      3 反向传播 (backpropagation) 计算权重和响应梯度

      4 用梯度更新权重

    (4)训练参数

      1 learning rate

      2 weight decay

      3 momentum

    (5)正则化(regularization)与求解器(solver)可选

    4 Marvin工程文件介绍

    (1)源文件: marvin.hpp和 marvin.cu

    (2)可执行文件:./marvin

    (3)matlab脚本,python脚本等

    (4).tensor后缀的文件是数据输入输出文件(估计是中间文件之类的)

    (5).marvin是模型的权重参数文件,即训练的结果

    (6).json文件是网络结构描述文件,marvin.hpp文件中存在类JSON可以对.json文件进行解析

    5 数据格式操作及转换

    (1)tensor file format

    (2)张量数据类型转换: matlab与python工具箱中提供了相应的方法

    6 JSON网络架构

    (1)JSON文件格式介绍: http://www.json.org/

    (2)在线查看器:http://jsonviewer.stack.hu  等

    (3)网络可视化工具: tools/viewer_matlab

    (4)层之间应当遵循拓扑顺序; 层的名称具有唯一性; 测试与训练的mini-batch size应当一致 

    7 layer介绍

    (1)卷积层convolution

    (2)内积层InnerProduct

    (3)激活层activation

    (4)LRN层

    (5)Dropout层

    (6)softmax层

    (7)loss层

    (8)池化pooling层

    8 数据层: class DataLayer及其子类

    (1)为了重用training 和 testing的显存,需要将training 和 testing的mini-batch size 设置成一样的

    (2)DataLayer中的超参数的意义

      1 numofitems: 如果你在训练集中有64000张图片,那么  numofitems == 64000

      2 mini-batch size:深度学习每一次参数的更新所需要损失函数并不是由一个 {data: label} 获得的,而是由一组数据加权得到的,这一组数据的数量就是 [batch size]

    https://blog.csdn.net/xys430381_1/article/details/80680167  # 关于使用batch size的利弊分析

      3 epoch: 当我们分批学习时,每次使用过全部训练数据(全部子集)完成一次Forword运算以及一次BP运算,成为完成了一次epoch

      4 iterations: 迭代。比如,我们有1000个样本,batch size是50,其将会有20个Iterations。这20个Iteration完成一个epoch

    (3)MemoryData: 将所有数据&标签全部加载到cpu内存中,每次前向运算使用RAM中的部分数据和标签

      1 name

      2 phase: "Training", "Testing", "TrainingTesting"

      3 file_data: path to a tensor file for data    # 训练数据的路径信息

      4 file_lable: path to a tensor file for lable   # 训练标签的路径信息 

      5 file_mean: path to a tensor file for the mean for subtraction, default empty "" to disable sutraction   # 一个张量文件的路径,用于求减法的平均值

      6 batch_size: 64, scale: 1.0, mean: 0.0

    (4)DiskData: 将所有的数据&标签加载到CPU内存中,将所有数据放在开放文件夹里,每次前向运算,从CPU RAM中读入一部分标签, 移动硬盘指针将文件读取并传入GPU

    当数据量比较大的时候用,但是不适用于CPU RAM, 比如ImageNet

      1 name: datalayer name

      2 phase: "Training", "Testing", "TrainingTesting"

      3 in: the mean used to subtract typically provide form the out of tensor constant data layer       # 用于相减的平均值,通常由张量常数数据层提供

      4 out: the first is the data, the second is the label 

      5 file_data: path to a tensor file for data    # 训练数据的路径信息

      6 file_label: path to a tensor file for lable   # 训练标签的路径信息 

      7 batch_size: 64

      8 mirror: true/false, horizontally flip the image randomly   # 是否随机水平翻转图像

      9 size_crop: if the size_crop is smaller than the size of items in file _data, Marvin will randomly crop 

    9 PPT版Marvin介绍下载链接

    https://github.com/2017Greg/myVscodeProject
  • 相关阅读:
    2016第17周四
    2016第17周三
    2016第17周二
    OSGI框架学习
    2016年第16周日
    2016第16周六
    如何培养技术洞见力
    2016第15周四
    深入浅出ClassLoader
    Linux智能小开关rfkill
  • 原文地址:https://www.cnblogs.com/ghjnwk/p/10534136.html
Copyright © 2011-2022 走看看