随机梯度下降的实现细节

http://www.miaoerduo.com/deep-learning/%E5%9F%BA%E4%BA%8Ecaffe%E7%9A%84deepid2%E5%AE%9E%E7%8E%B0%EF%BC%88%E4%B8%8A%EF%BC%89.html

最近看了一篇文章,详细说明了随机梯度下降中随机是在create_imagenet.sh中shuffle实现的。

相关资源:

  • DeepID:http://mmlab.ie.cuhk.edu.hk/pdf/YiSun_CVPR14.pdf
  • DeepID2:http://papers.nips.cc/paper/5416-analog-memories-in-a-balanced-rate-based-network-of-e-i-neurons
  • Caffe:http://caffe.berkeleyvision.org/

由于篇幅较大,这里会分成几个部分,依次讲解。

一、设计我们独特的Data层

在DeepID2中,有两种监督信号。一是Identity signal,这和DeepID中的实现方法一样,用给定label的人脸数据,进行分类的训练,这里使用softmax_with_loss层来实现(softmax+cross-entropy loss)。这里不再介绍。

另一种就是verification signal,也就是人脸比对的监督。这里要求,输入的数据时成对存在,每一对都有一个公共的label,是否是同一个类别。如果是同一个identity,则要求他们的特征更接近,如果是不同的identity,则要求他们的特征尽可能远离。

不论最终怎么实现,我们的第一步是确定的,构造合适的数据。

使用Caffe训练的时候,第一步是打Batch,将训练数据写入LMDB或者LevelDB数据库中,训练的时候Caffe会从数据库中读取图片,因此一个简单的实现方法就是构造许多的pair,然后打Batch的时候就能保证每对图片都是相连的,然后在训练的时候做一些小Trick就可以实现。

但是就如上面所说,打Batch的同时,图片的顺序就已经是确定的了,因此网络输入的图片pair也是固定的,这样似乎就缺乏了一些灵活性。

那么如何动态的构造我们的训练数据呢?

设计我们独特的data层。

这里为了方便,使用Python来拓展Caffe的功能。Python是一门简洁的语言,非常适合做这种工作。不过Caffe中如果使用了Python的层,那么就不能使用多GPU了,这点需要注意(希望以后能增加这个支持)。

1)让你的Caffe支持Python拓展。

在Caffe根目录的Makefile.config中,有这么一句话。

with_python_layer

我们需要使用Python层,因此需要取消这个注释。

之后Make一下你的Caffe和pycaffe。

这样Caffe就支持Python层了。

2)编写data层

基于Python的data层的编写,Caffe是给了一个简单的例子的,在/caffe_home/examples/pycaffe/layers/中。

我们简单的照着这个例子来写。

首先,我们定义自己需要的参数。

这里,我们需要:

  • batch_size: batch的大小,没什么好解释的,要求这个数是大于0的偶数
  • mean_file:图像的均值文件的路径
  • scale:图像减均值后变换的尺度
  • image_root_dir:训练数据的根目录
  • source:训练数据的list路径
  • crop_size:图像crop的大小
  • ratio:正样本所占的比例(0~1)

caffe在train.prototxt中定义网络结构的时候,可以传入这些参数。我们目前只需要知道,这些参数一定可以获取到,就可以了。另外,source表示训练数据的list的文件地址,这里用到的训练数据的格式和Caffe打batch的数据一样。

file_path1    label1

file_path2    label2

这样的格式。

Data层的具体实现,首先需要继承caffe.Layer这个类,之后实现setup, forward, backward和reshape,不过data层并不需要backward和reshape。setup主要是为了初始化各种参数,并且设置top的大小。对于Data层来说,forward则是生成数据和label。

闲话少说,代码来见。

上述的代码可以根据给定的list,batch size,ratio等参数生成符合要求的data和label。这里还有一些问题需要注意:

  1. 对输入的参数没有检验。
  2. 没有对读取图像等操作做异常处理。因此如果很不幸地读到的图片路径不合法,那么程序突然死掉都是有可能的。。。作者的数据都是可以读的,所以木有问题。
  3. 在选取正负样本对的时候,对于正样本对,只有样本对应的label中的图片数大于5的时候,才选正样本(作者的训练数据每个人都有至少几十张图片,所以木有出现问题),如果样本比较少的话,可以更改这个数(特别是有测试集的时候,测试集通常数目都很少,作者训练的时候都是不用测试集的,因为会死循环。。。)。对于选取负样本对的时候,只是随便选了两张图片,而并没有真的保证这一对是不同label,这里考虑到训练数据是比较多的,所以不大可能选中同一个label的样本,因此可以近似代替负样本对。
  4. 这里有个减均值的操作,这个均值文件是经过特殊转换求出的numpy的数组。Caffe生成的均值文件是不能直接用的,但是可以通过仿照Caffe中Classifier中的写法来代替(caffe.io.Transformer工具)。另外这里的图片数据和均值文件是一样大小的,但实际上可能并不一定相等。如果需要对输入图片做各种随机化的操作,还需要自己修改代码。

至此,我们就完成了一个简单的Data层了。

那么在么调用自己的data层呢?

这里有一个十分简单的写法。在我们用来训练的prototxt中,将Data层的定义改成如下的方式:

python_param中的这三个参数需要注意:

module:模块名,我们先前编写的data层,本身就是一个文件,也就是一个模块,因此模块名就是文件名。

layer:层的名字,我们在文件中定义的类的名字。这里比较巧合,module和layer的名字相同。

param_str:所有的需要传给data层的参数都通过这个参数来传递。这里简单的使用了Python字典的格式的字符串,在data层中使用eval来执行(o(╯□╰)o  这其实并不是一个好习惯),从而获取参数,当然也可以使用别的方式来传递,比如json或者xml等。

最后,你在训练的时候可能会报错,说找不到你刚刚的层,或者找不到caffe,只需要把这个层的代码所在的文件夹的路径加入到PYTHONPATH中即可。

这样就完成了我们的Data层的编写,是不是非常简单?

重要更新:
1,作者最近发现直接在image_data_layer.cpp中进行修改,可以更好的实现这个目标,而且支持多GPU。
2,训练的数据可以只用正样本对,因为identity signal已经十分强调不同identity的feature之间的距离,因此verification signal只需要强调相同的identity的feature相近就好。
3,作者新的训练数据,构造pair的方式也做了修改。每次使用所有的数据构造pair,然后用来训练,每个epoch后都重新生成一次list。这样可以保证identity signal能够每次训练所有的图片,而verification signal也能每次训练不同的样本对。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

那位标榜技术驱动的开发者去哪了?

作者:邹溪源,长沙资深互联网从业者,架构师社区合伙人!一他是一位曾经标榜技术驱动世界的开发者,在他年轻的时候,一段独特的经历,让他对技术充满了兴趣,并在技术这条道路上走了很远很…

图像PCA方法

http://blog.csdn.net/lifeng_math/article/details/50014073 http://blog.csdn.net/lifeng_math/article/details/49993763#旋转不变的-lbp 引言 PCA是Principal Component Analysis的缩写,也就是主成分分析。也是用于降维常用的一中方法。PCA 主要用于数据降维&a…

.NET实时2D渲染入门·动态时钟

前言说来这是个我和我老婆的爱情故事。从小以来“坦克大战”、“魂斗罗”等游戏总令我魂牵梦绕。这些游戏的基础就是 2D实时渲染,以前没意识,直到后来找到了 Direct2D。我的 2D实时渲染入门,是从这个 动态时钟开始的。本文将使用我写的“准游…

ASP.NET Core在 .NET Core 3.1 Preview 1中的更新

.NET Core 3.1 Preview 1现在可用。此版本主要侧重于错误修复,但同时也包含一些新功能。对Razor components的部分类支持将参数传递给顶级组件在HttpSysServer中支持共享队列在SameSite cookies的重大更改除了.NET Core 3.1 Preview版本发布之外,我们还发…

小波变换学习(1)

转自:https://www.zhihu.com/question/22864189/answer/40772083从傅里叶变换到小波变换,并不是一个完全抽象的东西,可以讲得很形象。小波变换有着明确的物理意义,如果我们从它的提出时所面对的问题看起,可以整理出非常…

.NET Core 3.0 新 JSON API - JsonDocument

JsonDocument类 JsonDocument是基于Utf8JsonReader 构建的。JsonDocument 可分析 JSON 数据并生成只读文档对象模型 (DOM),可对模型进行查询,以支持随机访问和枚举。使用 JsonDocument 分析常规 JSON 有效负载并访问其所有成员比使用 Json.NET 快 2-3 倍…

微软推出 Microsoft.Data.SqlClient,替代 System.Data.SqlClient

背景在 .NET 创建之初,System.Data 框架是一个重要的组件。它为创建 .NET 数据库驱动程序提供了一种方式,类似 Visual Basic 的 ActiveX Data Objects。虽然 API 不一样,但重用了它的名称,所以才有了 ADO .NET 这个绰号。ADO 和 A…

C++ 从文件夹中读取文件

OpenCV从文件夹中读取内含文件方法 参考&#xff1a;http://www.2cto.com/kf/201407/316515.html http://www.it610.com/article/5126146.htm http://blog.csdn.net/adong76/article/details/39432467 windows平台代码&#xff1a; [cpp] view plaincopy #include <io.h&…

你必须知道的容器监控 (1) Docker自带子命令与Weave Scope

本篇已加入《》&#xff0c;可以点击查看更多容器化技术相关系列文章。本篇会介绍几个目前比较常用且流行的容器监控工具&#xff0c;首先我们来看看Docker自带的几个监控子命令&#xff1a;ps、top以及stats&#xff0c;然后是一个功能更强的开源监控工具Weave Scope。# 实验环…

char *与char []

由于指针的灵活性&#xff0c;导致指针能代替数组使用&#xff0c;或者混合使用&#xff0c;这些导致了许多指针和数组的迷惑&#xff0c;因此&#xff0c;刻意再次深入探究了指针和数组这玩意儿&#xff0c;其他类型的数组比较简单&#xff0c;容易混淆的是字符数组和字符指针…

.NET Core ORM 类库Petapoco中对分页Page添加Order By对查询的影响

介绍最近一直在使用PetapocoEntity Framework Core结合开发一套系统。使用EFCore进行Code First编码&#xff0c;使用使用Petapoco进行数据库的常规操作。并且结合PetaPoco.SqlKata的使用&#xff0c;减少了编写SQL语句的工作量&#xff0c;对提升开发效率有很大的帮助。Petapo…

.Net Core 3.0 IdentityServer4 快速入门

一、简介IdentityServer4是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架。将IdentityServer4部署到您的应用中具备如下特点&#xff1a;1&#xff09;、认证服务2&#xff09;、单点登陆3&#xff09;、API访问控制4&#xff09;、联合网关5&#xff09;、专注于定制6&…

.NET Core3.0创建Worker Services

.NET CORE 3.0新增了Worker Services的新项目模板&#xff0c;可以编写长时间运行的后台服务&#xff0c;并且能轻松的部署成windows服务或linux守护程序。如果安装的vs2019是中文版本&#xff0c;Worker Services变成了辅助角色服务。Worker Services 咱也不知道怎么翻译成了这…

OpenCV Mat数据类型像素操作

转自&#xff1a;http://blog.csdn.net/skeeee/article/details/13297457 OpenCV图像像素操作及效率分析 在计算机视觉应用中&#xff0c;对于图像内容的读取分析是第一步&#xff0c;所以学习高效的处理图像是很有用的。一个图像有可能包含数以万计的像素&#xff0c;从根本上…

Bumblebee微服务网关之Url重写

为了提高Url访问的统一和友好性&#xff0c;一般访问的Url和服务定义的Url有所不同;为了解决这一问题Bumblebee提供Url重写功能;通过Url重写功能可以在转发前进行一个重写后再转发到后台服务。引用插件Bumblebee中使用Url重写需要引用两个插件&#xff0c;分别是Bumblebee.Conf…

依赖注入:一个Mini版的依赖注入框架

前面的章节中&#xff0c;我们从纯理论的角度对依赖注入进行了深入论述&#xff0c;我们接下来会对.NET Core依赖注入框架进行单独介绍。为了让读者朋友能够更好地理解.NET Core依赖注入框架的设计与实现&#xff0c;我们按照类似的原理创建了一个简易版本的依赖注入框架&#…

.NET Core 3.0 新 JSON API - JsonSerializer

JsonSerializer 前面几节的内容可能稍微有点底层&#xff0c;我们大部分时候可能只需要对C#的类进行串行化或者将JSON数据反串行化成C#类&#xff0c;在.NET Core 3.0里面&#xff0c;我们可以使用JsonSerializer这个类来做这些事情。 例子 还是使用之前用到的json数据&#xf…

Caffe查看每一层学习出来的pattern

Filter visualization http://www.cnblogs.com/dupuleng/articles/4244877.html 这一节参考http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/filter_visualization.ipynb&#xff0c;主要介绍如何显示每一层的参数及输出&#xff0c;这一部分非常重要&am…

.NET Core 3.0 新 JSON API - Utf8JsonWriter

Utf8JsonWriter类 下面研究一下如何写入json文件。这里需要使用Utf8JsonWriter类。 直接看代码&#xff1a; 这个类需要传递的参数类型是Stream或者Buffer&#xff0c;也就是向Stream或Buffer里面写入数据。 那么就提供一个buffer&#xff1a; 下面单独写一个方法&#xff0c;来…

python查看CNN训练模型参数

参照&#xff1a;http://blog.csdn.net/u011762313/article/details/49851795 #!/usr/bin/env python# 引入“咖啡” import caffeimport numpy as np# 使输出的参数完全显示 # 若没有这一句&#xff0c;因为参数太多&#xff0c;中间会以省略号“……”的形式代替 np.set_prin…