算算加快,人工降雨
分类:技术

“就是哦。”

bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --copt=-cuda -k //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

 

图片 1

在/tmp/tensorflow_pkg产生whell文件,再用pip命令安装wheel文件。

小喵的唠叨话:在写完上一次的博客之后,已经过去了2个月的时间,小喵在此期间,做了大量的实验工作,最终在使用的DeepID2的方法之后,取得了很不错的结果。这次呢,主要讲述一个比较新的论文中的方法,L-Softmax,据说单model在LFW上能达到98.71%的等错误率。更重要的是,小喵觉得这个方法和DeepID2并不冲突,如果二者可以互补,或许单model达到99%+将不是梦想。

一听此言,很不舒服,奇了怪了你们不是一家人啊,知道又是白说了,正想着,一个尖利刺耳的女人声音从里面不耐烦地吼起:“行了行了,啰里啰嗦说那么多 干嘛,我又不是故意的!”

人脸识别性能指标。
鉴别性能,是否鉴别准确。Top-K识别率,给出前K个结果包含正确结果概率。错误拒绝辨识率(FNIR),注册用户被系统错误辩识为其他注册用户比例。错误接受辩识率(FPIR),非注册用户被系统辨识为某个注册用户比例。
验证性能,验证人脸模型是否足够好。误识率(False Accept Rate,FAR),将其他人误作指定人员概率。拒识率(False Reject Rate,FRR),将指定人员误作其他人员概率。识别速度,识别一副人脸图像时间、识别一个人时间。注册速度,注册一个人时间。

一、margin与lambda

margin和lambda这两个参数是我们这篇博客的重点。也是整篇论文的重点。对于分类的任务,每个样本都会有N的输出的分数(N的类别),如果在训练中,人为的使正确类别的得分变小,也就是说加大了区分正确类别的难度,那么网络就会学习出更有区分能力的特征,并且加大类间的距离。作者选用的加大难度的方式就是改变最后一个FC层中的weight和特征之间的角度值,角度增大的倍数就是margin,从而使特定类别的得分变小。而第二个参数lambda是为了避免网络不收敛而设定的,我们之后会讲到。

为了实现这个效果,我们需要设计一个新的层,large_margin_inner_product_layer。这个层和一般的inner_product_layer很相似,但是多了特定类别削弱的功能。 考虑到这个层是有参数的,我们需要在caffe.proto(caffe_home/src/caffe/proto/caffe.proto)中做一些修改。这里的定义是按照protobuf的语法写的,简单的修改只要照着其他的参数来改写就好。 首先定义我们的这个层的参数。

 1 message LargeMarginInnerProductParameter {
 2   optional uint32 num_output = 1; // The number of outputs for the layer
 3   optional bool bias_term = 2 [default = true]; // whether to have bias terms
 4   optional FillerParameter weight_filler = 3; // The filler for the weight
 5   optional FillerParameter bias_filler = 4; // The filler for the bias
 6 
 7   // The first axis to be lumped into a single inner product computation;
 8   // all preceding axes are retained in the output.
 9   // May be negative to index from the end (e.g., -1 for the last axis).
10   optional int32 axis = 5 [default = 1];
11   // Specify whether to transpose the weight matrix or not.
12   // If transpose == true, any operations will be performed on the transpose
13   // of the weight matrix. The weight matrix itself is not going to be transposed
14   // but rather the transfer flag of operations will be toggled accordingly.
15   optional bool transpose = 6 [default = false];
16   optional uint32 margin = 7 [default = 1];
17   optional float lambda = 8 [default = 0];
18 }

参数的定义和InnerProductParameter非常相似,只是多了两个参数margin和lambda。 之后在LayerParameter添加一个可选参数(照着InnerProductParameter写就好)。

optional LargeMarginInnerProductParameter large_margin_inner_product_param = 147;

这时,喵粉可能很在意这个147是怎么回事。其实呢,在protobuf中,每个结构中的变量都需要一个id,只要保证不重复即可。我们在LayerParameter的最开始可以看到这么一行注释: 图片 2

说明下一个有效的id是147。这里我们新加的参数就果断占用了这个id。

修改之后,建议把注释改一下(不要人为的挖坑): LayerParameter next available layer-specific ID: 148 (last added: large_margin_inner_product_param)

避免之后再新加层的时候出问题。

工作完毕,我们就可以在train_val.prototxt中用这种方式使用这个新层了(具体的使用,后面再说):

 1 layer {
 2   name: "fc2"
 3   type: "LargeMarginInnerProduct"
 4   bottom: "fc1"
 5   bottom: "label"
 6   top: "fc2"
 7   param {
 8     lr_mult: 1
 9     decay_mult: 1
10   }
11   param {
12     lr_mult: 0
13     decay_mult: 0
14   }
15   large_margin_inner_product_param {
16     num_output: 10000
17     margin: 2
18     lambda: 0
19     weight_filler {
20       type: "xavier"
21     }    
22   }
23 }

 

我气愤地一把收下“物证”,抓在手中,先跑到屋外查看,抬头往上一望,果然,四楼晒出的地垫正不紧不慢地悠哉悠哉地大滴大滴往下滴着水滴,是那么的刺眼扎心。

公开数据集。

博客原文:  http://www.miaoerduo.com/deep-learning/基于caffe的large-ma…ftmax-loss的实现(上).html 

听完小黄无奈的回答,我一个鲤鱼打挺翻身起来,急忙冲到阳台一看,晒出去的衣物星星点点地都被滴湿了,一上午的辛辛苦苦又全都被四楼这家无情地作废了,顿然心中火冒三丈,头都大了。

参考资料:
《TensorFlow技术解析与实战》

和上一篇博客一样,小喵对读者做了如下的假定:

中午正睡得迷迷糊糊的时候,手机突然唱起了歌,极不情愿地拿起来,一看是三楼的小黄,立马接过电话,心里在打鼓:是不是老天又在卖大---下雨了吧?

问答数据集。
MS MARCO(Microsoft Machine Reading Comprehension) 。微软发布,10万个问题和答案数据集。创建像人类一样阅读、回答问题系统。基于匿名真实数据构建。
康奈尔大学电影对白数据集 。600部好莱坞电影对白。

小喵的博客网址是:

顿时一切烟消云散!那“人工降雨”也会就此烟消云散!

人脸数据集。
AFLW(Annotated Facial Landmarks in the Wild) ,从Flickr收集带标注面部图像大规模wyskwgk,各种姿态、表情、光照、种族、性别、年龄因素影响图片,25000万手工标注人脸图片,每个人脸标注21个特征点,大多数彩色,59%女性,41%男性。非常适合人脸识别、人脸检测、人脸对齐。
LFW(Labeled Faces in the Wild Home) 。美国马萨诸塞大学阿姆斯特分校计算机视觉实验室整理。13233张图片,5749人,4096人只有一张图片,1680个多于一张。用于研究非受限情形人脸识别问题。人脸外形不稳定,面部表情、观察角度、光照条件、室内室外、遮盖物(口罩、眼镜、帽子)、年龄影响。为学术界评价识别性能标准(benchmark)。
GENKI ,加利福尼亚大学收集。包含GENKI-R2009a、GENKI-4K、GENKI-SZSL。GENKI-R2009a,11159图片。GENKI-4K,4000图片,笑与不笑两类,每个图片人脸姿势、头转动标注角度,专用笑脸识别。GENKI-SZSL,3500图像,广泛背景、光照条件、地理位置、个人身份、种族。
VGG Face 。2622个不同人,每个人1000张图片,训练人脸识别大数据集。
CelebA(Large-scale CelebFaces Atributes,大规模名人人脸标注数据集) 。10177个名人,202599张名人图像,每张图像40个属性标注。

二,运筹帷幄之成员变量

我们刚刚在caffe.proto中,添加了新参数的定义。而事实上,我们还没有这个层的具体实现。这部分,主要介绍我们需要的临时变量。 首先,我们要理清整个计算的流程。

先看前馈。

第一步,需要求出W和x的夹角的余弦值:

[cos(theta_j)=frac{W_j^Tx_i}{|W_j||x_i|}]

第二步,计算m倍角度的余弦值:

[cos(mtheta_i)=sum_n(-1)^n{C_m^{2n}cos^{m-2n}(theta_i)cdot(1-cos(theta_i)^2)^n}, (2nleq m)]

第三步,计算前馈:

[f_{y_{i}}=(-1)^kcdot|W_{y_{i}}||x_{i}|cos(mtheta_i)-2kcdot|W_{y_i}||x_i|]

k是根据$cos(theta)$的取值决定的。

后馈比前馈要复杂一些,不过使用的变量也是一样的。 因此我们可以编写自己的头文件了。

 1 #ifndef CAFFE_LARGE_MARGIN_INNER_PRODUCT_LAYER_HPP_
 2 #define CAFFE_LARGE_MARGIN_INNER_PRODUCT_LAYER_HPP_
 3 
 4 #include <vector>
 5 
 6 #include "caffe/blob.hpp"
 7 #include "caffe/layer.hpp"
 8 #include "caffe/proto/caffe.pb.h"
 9 
10 namespace caffe {
11 
12 template <typename Dtype>
13 class LargeMarginInnerProductLayer : public Layer<Dtype> {
14  public:
15   explicit LargeMarginInnerProductLayer(const LayerParameter& param)
16       : Layer<Dtype>(param) {}
17   virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom,
18       const vector<Blob<Dtype>*>& top);
19   virtual void Reshape(const vector<Blob<Dtype>*>& bottom,
20       const vector<Blob<Dtype>*>& top);
21 
22   virtual inline const char* type() const { return "LargeMarginInnerProduct"; }
23   // edited by miao
24   // LM_FC层有两个bottom
25   virtual inline int ExactNumBottomBlobs() const { return 2; }
26   // end edited
27   virtual inline int ExactNumTopBlobs() const { return 1; }
28 
29  protected:
30   virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom,
31       const vector<Blob<Dtype>*>& top);
32   virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom,
33       const vector<Blob<Dtype>*>& top);
34   virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,
35       const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
36   virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
37       const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
38 
39   int M_;
40   int K_;
41   int N_;
42   bool bias_term_;
43   Blob<Dtype> bias_multiplier_;
44   bool transpose_;  ///< if true, assume transposed weights
45 
46   // added by miao
47 
48   // 一些常数
49   Blob<Dtype> cos_theta_bound_;   // 区间边界的cos值
50   Blob<int> k_;                   // 当前角度theta所在的区间的位置
51   Blob<int> C_M_N_;               // 组合数
52   unsigned int margin;            // margin
53   float lambda;                   // lambda
54 
55   Blob<Dtype> wx_;                // wjT * xi
56   Blob<Dtype> abs_w_;             // ||wj|| 
57   Blob<Dtype> abs_x_;             // ||xi||
58   Blob<Dtype> cos_t_;             // cos(theta)
59   Blob<Dtype> cos_mt_;            // cos(margin * theta)
60 
61   Blob<Dtype> dydw_;              // 输出对w的导数
62   Blob<Dtype> dydx_;              // 输出对x的导数
63   // end added
64 };
65 
66 }  // namespace caffe
67 
68 #endif  // CAFFE_LARGE_MARGIN_INNER_PRODUCT_LAYER_HPP_

这里主要是复制了inner_product_layer.hpp,然后做了一点修改。具体是增加了几个成员变量,同时改了ExactNumBottomBlobs的返回值,因为我们的这个层磁带bottom需要两个,前一层的feature和样本的label。

此言一出,强压的鬼火顿时被烧了起来,我也提高了嗓门,连珠炮似地迸发:一次不是故意的,一而再再而三的这样做,不是故意的也是故意的,你们这两个年轻人看上去也有模有样的,就这素质啊,还讲不讲公德?!太自私了吧?!有能耐住单家独院的别墅去,这样就可以无所顾忌了.......

TensorFlow计算加速。GPU设备,XLA 框架融合OP,分布式计算、参数部分分布到不同机器,硬件计算,CPU更高级指令集SSE、AVX,FPGA编写支持TensorFlow计算单元。
CPU加速。pip命令安装,与更广泛机器兼容,TensorFlow默认仅在x86机器使用SSE4.1 SIMD指令。源代码安装可以获得最大性能,开启CPU高级指令集支持。bazel 构建只能在自己机器运行二进制文件。

Google一下,第一条应该就是论文的地址,鉴于大家时间有限,小喵把原文地址也贴出来了,但不保证长期有效。 这里我们也将整个系列分几部分来讲。

听着听着,我真诚的露出笑脸说:“哦,没事,没事,以后注意就是了,我也是个急性子,不要见外啊,楼上楼下的低头不见抬头见。”

欢迎推荐上海机器学习工作机会,我的微信:qingxingfengzi

  1. 了解Deep Learning的基本知识。
  2. 仔细阅读过L-Softmax的论文,了解其中的数学推导。
  3. 使用Caffe作为训练框架。
  4. 即使不满足上述3条,也能持之以恒的学习。

“又是四楼的吧?”

TPU 加速、FPGA加速。
谷歌TensorFlow设计专用集成芯片-张量处理单元(Tensor Processing Unit,TPU)。CPU逻辑运算(if else)能力很强,计算能力比GPU差,深度学习需要海量计算。GPU有强大浮点计算单元,GPU着色器(shader)对一批数据以相同步调执行相同指令流水。GPU同一时钟周期执行指令数量千级,3000条。CPU同一时钟周期执行指令数据几十级。数据并行能力远超CPU。GPU逻辑运算能力差,流水线并行能力(同一时钟周期并发执行不同逻辑序列能力)差,需要批数据同步调执行相同逻辑。神经网络需要大规模数据并行能力,CNN卷积、矩阵运算操作,通过数据并行大幅提高性能。
GPU出厂后架构固定,硬件原生支持指令固定。如神经网络有GPU不支持指令,无法直接硬件实现,只能软件模拟。FPGA加速,开发者在FPGA里编程,改变FPGA硬件结构。FPGA体系结构不同,不是冯·诺伊曼结构,是代码描述逻辑电路。只要片上逻辑门、引脚够多,全部输入、运算、输出都在一个时钟周期内完成。FPGA一个时钟周期执行一次全部烧好电路,一个模块就一句超复杂“指令”,不同模块不同逻辑序列,序列里就一条指令。不同运算单元硬件直连,数据并行、流水线并行共存(GPU流水线并行能力约0),浮点运算能力不如GPU。适合低延迟预测推理,每批大小较小。
TPU,专用集成电路(application specific integrated circuit,ASIC),硬件逻辑一旦烧写不可再编程,专门为TensorFlow做深度学习开发。TPU目前版本不能完整运行TensorFlow功能,高效预测推理,不涉及训练。

L-Softmax的论文:Large-Margin Softmax Loss for Convolutional Neutral Networks

本文由奥门金沙网址发布于技术,转载请注明出处:算算加快,人工降雨

上一篇:弧线之美,那些上有老下有小的日子 下一篇:没有了
猜你喜欢
热门排行
精彩图文