利用GPU和Caffe训练神经网络

利用GPU和Caffe训练神经网络

摘要:本文为利用GPU和Caffe训练神经网络的实战教程,介绍了根据Kaggle的“奥托集团产品分类挑战赛”的数据进行训练一种多层前馈网络模型的方法,如何将模型应用于新数据,以及如何将网络图和训练权值可视化。

【编者按】本文为利用GPU和Caffe训练神经网络的实战教程,介绍了根据Kaggle的“奥托集团产品分类挑战赛”的数据进行训练一种多层前馈网络模型的方法,如何将模型应用于新数据,以及如何将网络图和训练权值可视化。



Caffe是由贾扬清发起的一个开源深度学习框架,它允许你利用你的GPU训练神经网络。相对于其他的深度学习框架如Theano或Torch等,Caffe不需要你自己编写算法程序,你只需要通过配置文件来指定网络。显然,这种做法比自己编写所有程序更加节省时间,也将你限制在一定的框架范围内。不过,在大多数情况下,这没有太大的问题,因为Caffe提供的框架相当强大,并且不断进步。

这篇文章的主题由一种多层前馈网络组成。该模型将根据Kaggle的“奥托集团产品分类挑战赛”的数据进行训练。我们还关注将模型应用于新数据,以及如何将网络图(network graph)和训练得到的权值可视化。限于篇幅,本文不会解释所有的细节。另外,简单的代码比一千多字的话更有说服力。相对于对照IPython Notebook来程序化细节,本文将着重描述观念以及一些我遇到的绊脚石。

设置

如果你还没有把Caffe安装在你的系统上,我建议在一个允许GPU处理的EC2实例上工作,例如g2.2xlarge实例。有关如何使用EC2工作的介绍可以查看Guide to EC2 from the Command Line,设置Caffe及其准备工作可以参考GPU Powered Deep Learning with NVIDIA DIGITS on EC2。对于使用Caffe,我也建议你在你的实例上安装IPython Notebook——在这里可以找到教程。

定义模型和元参数

一个模型及其应用的训练至少需要三个配置文件。这些配置文件的格式遵循界面描述语言,称为协议缓冲区(protocol buffers)。它表面上类似于JSON,但却又显著不同,实际上应该在需要进行验证(通过自定义模式的方式——像Caffe的这个这样)和序列化的数据文档中取代它。

为了训练,你必须有一个prototxt文件保持训练的元参数(config.prototxt)以及一个模型用于定义网络图形(model_train_test.prototxt)——以非周期和定向的方式连接各层。需要注意的是,数据从底部流向到顶部时伴随着关于怎样指定层的顺序。这里的示例网络有五个层次:

  1. 数据层(一个用于训练,一个用于测试)
  2. 内积层(权值Ⅰ)
  3. ReLUs(隐含层)
  4. 内积层(权值Ⅱ)
  5. 输出层(用于分类的Soft Max)

A,Soft Max层给出损失
 B,准确性层——允许我们看到网络如何在训练的同时提升。

以下从model_train_test.prototxt的摘录显示层(4)和(5A):

[...]
layer {
  name: "ip2"
  type: "InnerProduct"
  bottom: "ip1"
  top: "ip2"
  inner_product_param {
    num_output: 9
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "ip2"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
[...]

第三个prototxt文件(model_prod.prototxt)指定应用于它的网络。在这种情况下,它与训练规范大体上是一致的——但它缺乏数据层(因为我们不从产品的数据源中读取数据)并且Soft Max层不会产生损耗值但有分类的可能。另外,准确性层现在已经没有了。还要注意的是,我们现在在开始指定输入尺寸(如预期:1,93,1,1)——它是肯定混乱的,所有四个尺寸被称为input_dim,只有顺序定义哪个是哪个,并没有指定明确的背景。

支持的数据源

这是开始尝试使用Caffe时要克服的首要心理障碍之一。它不像使用一些CSV来提供Caffe可执行的方式那样简单。实际上,对于没有图像的数据,你有三种选择。

  • LMDB(闪电内存映射数据库)
  • LevelDB
  • HDF5格式

HDF5可能是最容易使用的,因为你只需要采用HDF5格式把数据集存储到文件中。LMDB和LevelDB是数据库,所以你必须按照他们的协议。HDF5格式存储数据集的大小会被内存限制,这就是为什么我抛弃它的原因。LMDB和LevelDB之间的选择是相当随便的——从我掠过的资源来看,LMDB似乎更强大,速度更快,更成熟。然后从GitHub来看,LevelDB的维护似乎更积极,也具有较大的Google和StackOverflow的足迹。

Blobs和Datums

Caffe内部使用一个叫做Blobs的数据结构进行工作,它用于正向传递数据和反向渐变。这是一个四维数组,其四个维度被称为:

  1. N或batch_size
  2. 通道
  3. 高度
  4. 宽度

这与我们有关,因为在把它存储到LMDB之前我们必须按照结构塑造我们的案例——从它被送到Caffe的地方。图像的形状是直观的,一批次64个按规定的100×200 RGB像素的图像将最终作为形阵列(64,3,200,100)。对于一批64个特征矢量,每个长度93的Blob的形状为(64,93,1,1)。

在将数据加载到LMDB时,你可以看到个别案例或特征向量存储在Datum的对象上。整型数据被存储在(字节串格式)data中,浮点型数据存储在float_data中。一开始我犯错将浮点型数据分配到data中,从而导致该模型不学习任何东西。在将Datum存储到LMDB之前,你需要将对象序列化成一个字节的字符串表示。

总结

对我来说,掌握Caffe是一个令人惊讶的非线性体验。也就是说,要深刻理解这个系统,还没有任何的切入点和持续的学习路径。让Caffe对你发挥作用的有效信息,分布在很多不同的教程GitHub上的源代码IPython Notebook以及论坛主题。这就是为什么我花时间撰写本教程及相关的代码。在我将学到的知识总结形成文本之后,我自己都要从头读一下。

我认为Caffe有一个光明的未来——只要添加新的功能,它将不仅仅是水平的增长,而且会垂直的重构和改善所有用户的体验。这绝对是高性能深度学习的好工具。如果你想要做图像处理和卷积神经网络,我建议你看看NVIDIA DIGITS,它会为你提供一个舒适的GUI来实现目标。

原文链接:Neural Nets with Caffe Utilizing the GPU(翻译/王玮 责编/周建丁)

时间: 2024-10-08 05:45:35

利用GPU和Caffe训练神经网络的相关文章

深度学习“引擎”之争:GPU加速还是专属神经网络芯片?

深度学习“引擎”之争:GPU加速还是专属神经网络芯片? 深度学习(Deep Learning)在这两年风靡全球,大数据和高性能计算平台的推动作用功不可没,可谓深度学习的“燃料”和“引擎”,GPU则是引擎的引擎,基本所有的深度学习计算平台都采用GPU加速.同时,深度学习已成为GPU提供商NVIDIA的一个新的战略方向,以及3月份的GTC 2015的绝对主角. 那么,GPU用于深度学习的最新进展如何?这些进展对深度学习框架有哪些影响?深度学习开发者应该如何发挥GPU的潜力?GPU与深度学习结合的前景

使用caffe训练自己的CNN

现在有这样的一个场景:给你一张行人的矩形图片, 要你识别出该行人的性别特侦. 分析: (1),行人的姿态各异,变化多端.很难提取图像的特定特征 (2),正常人判别行人的根据是身材比例.(如果是冬天的情况下,行人穿着厚实,性别识别更加难) solution: 针对难以提取特定特征的图像,可以采用卷积神经网络CNN去自动提取并训练. 数据准备:  采用 PETA数据集,Pedestrain Attribute Recognition At Far Distance. 该数据集一共包含了19000张标

使用caffe训练mnist数据集 - caffe教程实战(一)

个人认为学习一个陌生的框架,最好从例子开始,所以我们也从一个例子开始. 学习本教程之前,你需要首先对卷积神经网络算法原理有些了解,而且安装好了caffe 卷积神经网络原理参考:http://cs231n.stanford.edu/syllabus.html Ubuntu安装caffe教程参考:http://caffe.berkeleyvision.org/install_apt.html 先讲解一下caffe设计的架构吧: 训练mnist数据集使用 build/tools/caffe 训练步骤:

Ubuntu配置GPU+CUDA+CAFFE

参考网站: http://blog.csdn.net/xizero00/article/details/43227019/ (主要参考) http://www.cnblogs.com/platero/p/3993877.html (caffe+cudaGPU) http://www.cnblogs.com/platero/p/4118139.html (cuDNN) http://developer.download.nvidia.com/compute/cuda/repos/ubuntu140

    MD5,MySQL,SHA解密 - 利用GPU进行密码破解

使用方法: 1 打开命令行cmd 然后切换到egb的目录,假设你的文件夹在f盘,则输入:  f:2. 在当前目录输入: egb.exe /info查看你的电脑是否支持使用CUDA3. 可以将要破解的文件放置到当前目录4. 回到命令窗口,输入: egb.exe MD5 Settings/MD5.ini password.txt5. 上面的MD5表示使用MD5解密方式,而Settings/MD5.ini则是具体的配置文件.程序内置了72中不同类型的解密配置文件,可以自己浏览一下. 而passwd.t

新颖训练方法——用迭代投影算法训练神经网络

作者介绍:Jesse Clark 研究相位恢复的物理学家.数据科学家,有着丰富的建设网站与设计手机应用的经验,在创业公司有着丰富的经验,对创业有着极大的热情. Github: https://github.com/jn2clark Linkedin:http://www.linkedin.com/in/j3ss3cl4rk 相位恢复(PR)关心的是在给定幅度信息以及受到实空间限制下,找到复值函数(通常在傅立叶空间中)的相位[1]. PR是一个非凸优化问题,已经成为大量工作[1,2,3,4,5,6

caffe的学习和使用·一」--使用caffe训练自己的数据

学习知识的一种方式是先会用然后再问为什么. 在安装完成caffe,根据caffe的提示下载完mnist训练测试数据,并且运行lenet训练模型之后,摆在眼前的问题就是我怎么用caffe训练自己的数据啊,mnist的数据通过脚本就可以下载创建成lmdb,我要训练自己的数据集该怎么做? 用caffe训练自己的数据,必须解决的问题有两个:1.如何输入数据, 2.如何定义输出 首先我们解决第一个问题:训练数据的输入,这里我们之介绍使用lmdb的方式 查看lenet的train_val.prototxt,

stanford coursera 机器学习编程作业 exercise4--使用BP算法训练神经网络以识别阿拉伯数字(0-9)

在这篇文章中,会实现一个BP(backpropagation)算法,并将之应用到手写的阿拉伯数字(0-9)的自动识别上. 训练数据集(training set)如下:一共有5000个训练实例(training instance),每个训练实例是一个400维特征的列向量(20*20 pixel image).用 X 矩阵表示整个训练集,则 X 是一个 5000*400 (5000行 400列)的矩阵 另外,还有一个5000*1的列向量 y ,用来标记训练数据集的结果.比如,第一个训练实例对应的输出

使用Keras训练神经网络备忘录

使用Keras训练神经网络备忘录 小书匠 深度学习 文章太长,放个目录: 1.优化函数的选择 2.损失函数的选择 2.2常用的损失函数 2.2自定义函数 2.1实践 2.2将损失函数自定义为网络层 3.模型的保存 3.1同时保持结构和权重 3.2模型结构的保存 3.3模型权重的保存 3.5选择网络层载入 4.训练历史的保存 4.1检测运行过程的参数 4.2保持训练过程得到的所有数据 5.陷阱:validation_split与shuffle 1.优化函数的选择 先写结论,后面再补上每个优化函数的