Caffe

Caffe


caffe的单元 Blobs, layers, nets

- Blob

Blob作为caffe的存储及通信单元,是一个要被处理的真实数据(i.e. image batches, model parameters, derivatives for optimization)的封装。

Blob存储图像batch的方式为 (数目N)×(通道K)×(高H)×(宽W),以行优先方式存储,也就是说,`(n,k,h,w)`物理地址为`((n*K+k)*H+h)*W+w`.

起初, CAFFE 只支持 4-D blob 和 2-D 卷积(NxCxHxW),现在支持 n-D blobs 和 (n-2)-D 卷积。


- Layer

Layers category

- Data layer

  • Image Data
  • Database
  • HDF Input
  • HDF Output
  • Input
  • Window Data
  • Memory Data
  • Dummy Data
  • Python

- Vision layer

  • Convolution

      layer {
          name: "conv1"
          type: "Convolution"
          bottom: "data"
          top: "conv1"
          # learning rate and decay multipliers for the filters
          param { lr_mult: 1 decay_mult: 1 }
          # learning rate and decay multipliers for the biases
          param { lr_mult: 2 decay_mult: 0 }
          convolution_param {
            num_output: 96     # learn 96 filters
            kernel_size: 11    # each filter is 11x11
            stride: 4          # step 4 pixels between each filter application
            pad: 0             # pad up pixels
            weight_filler {
              type: "gaussian" # initialize the filters from a Gaussian
              std: 0.01        # distribution with stdev 0.01 (default mean: 0)
            }
            bias_filler {
              type: "constant" # initialize the biases to zero (0)
              value: 0
            }
          }
        }
    
    • weight_filter type: caffe 中支持的初始化filter类型有

        constant, 
        gaussian,  
        positive_unitball,
        xavier, 
        msra, 
        bilinear,  
        uniform  
      

    默认类型为 constant, 更详细的介绍见 include/caffe/filter.hpp

  • Pooling

      layer {
        name: "pool1"
        type: "Pooling"
        bottom: "conv1"
        top: "pool1"
        pooling_param {
          pool: MAX
          kernel_size: 3 # pool over a 3x3 region
          stride: 2      # step two pixels (in the bottom blob) between pooling regions
        }
      }
    
  • Spatial Pyramid Pooling(SPP)

  • Local Response Normalization(LRN)

  • Crop

      layer {
          bottom: "A"
          bottom: "B"
          top: "C"
          name: "crop_u1u2"
          type: "Crop"
      }
    

    CROP层用于裁剪数据。假设A、B层size分别为(20,50,512,512),(20,10,256,256),则输出层C的size是(20,10,256,256), 更详细解释见crop.

  • Im2col

  • Deconvolution layer(transpose convolution)

    same as Convolution layer

- Recurrent Layers

  • Recurrent

  • RNN

  • Long-Short Term Memory(LSTM)

- Common Layers

  • Inner Product - fully connected layer

  • Dropout

  • Embed

- Normalization Layers

  • Local Response Normalization(LRN)

  • Mean Variance Normalization(MVN)

  • Batch Normalization

- Activation Layers

  • ReLU and Leaky-ReLU

  • PReLU

  • ELU

  • Sigmoid

  • TanH

  • Absolute Value

  • Power- f(x)=(shift+scale*x)^power

  • Exp- f(x)=base^(shift+scale*x)

  • Log- f(x)=log(x)

  • BNLL- f(x)=log(1+exp(x))

  • Threshold

  • Bias

  • Scale

- Utility Layers

  • Flatter

  • Reshape

  • Batch Reindex

  • Split

  • Concat

     layer {
         bottom: "A"
         bottom: "B"
         top: "C"
         name: "concat_AB_C"
         type: "Concat"
         concat_param {
             axis: 1
         }
     }   
    

    假设 A、B 的 size 分别为 (n1, c1, h, w), (n2, c2, h, w),如果 axis=0, 则 C 的 size 为(n1+n2, c1, h, w) 且要求 c1=c2; 如果 axis=1, 则 C 的 size 为 (n1, c1+c2, h, 2) 且要求 n1=n2.

  • Slicing

  • Eltwise

    适用于残差学习(Residual Learning),实现 f(x) + x

     layer {
         bottom: "conv10"
         bottom: "conv11"
         top: "Res"
         name: "Res"
         type: "Eltwise"
         eltwise_param {
             op: SUM
             coeff: 1
             coeff: -1
         }
     }
    
  • Filter/Mask

  • Parameter

  • Reduction

  • Silence

  • ArgMax

  • Softmax

  • Python-allows custom Python layers

- Loss Layers

  • Multinomial Logistic Loss

  • Infogain Loss

  • Softmax with loss

     layer{
         name: "loss"
         type: "SoftmaxWithLoss"
         bottom: "pred"
         bottom: "label"
         top: "loss"
     }
    
  • Euclidean

  • Hinge/Margin

  • Sigmoid Cross-Entropy Loss

     layer{
         name: "loss"
         type: "SigmoidCrossEntropyLoss"
         bottom: "pred"
         bottom: "label"
         top: "loss"
     }
    
  • Accuracy/Top-k layer

  • Contrastive Loss

Multiple loss layers

事实上,一个网络可以包含很多 loss function, 只要它是一个 DAG (directed acyclic graph)(Caffe net本身可以是任何结构的DAG,不一定是线性结构)。 例如:

    layers {
        name: "recon-loss"
        type: "Euclidean"
        bottom: "reconstructions"
        bottom: "data"
        top: "recon-loss"
    }
    layers {
        name: "class-loss"
        type: "softmaxWithLoss"
        bottom: "class-preds"
        bottom: "class-labels"
        top: "class-loss"
        loss_weight: 100.0
    }

表示的 Loss function 就是:
[图片上传失败...(image-f7d5fd-1515046033856)]

任何 layer 都可以产生 loss
[图片上传失败...(image-ba13f5-1515046033856)]

- Net

    name: "LogReg"
    layer {
      name: "mnist"
      type: "Data"
      top: "data"
      top: "label"
      data_param {
        source: "input_leveldb"
        batch_size: 64
      }
    }
    layer {
      name: "ip"
      type: "InnerProduct"
      bottom: "data"
      top: "ip"
      inner_product_param {
        num_output: 2
      }
    }
    layer {
      name: "loss"
      type: "SoftmaxWithLoss"
      bottom: "ip"
      bottom: "label"
      top: "loss"
    }

- Net visualization

Netscope

~/caffe/python/draw_net.py yout_net.prototxt yoursave.png

- Solver

solver_type: SGD
[图片上传失败...(image-6c3951-1515046033856)]

solver_type: NESTEROV
[图片上传失败...(image-e8f5cd-1515046033856)]

solver_type: ADAGRAD
[图片上传失败...(image-58b7b4-1515046033856)]

[图片上传失败...(image-d1791d-1515046033856)]

- Weight sharing

[图片上传失败...(image-d0591c-1515046033856)]

caffe 使用问题集锦

  • Q1   训练过程中人为中断训练(ctrl+C),可否从中断时刻继续训练?

    Answer:  可以。

     caffe train -solver solver.prototxt -snapshot train_1000.solverstate
    

    以上示例表示从第1000步迭代继续训练。Training-and-Resuming

  • Q2   如何可视化卷积层?

    caffe 与 python 、matlab 接口

- 使用 python 接口可视化卷积层以及做相关的 test ( [jupyter](http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb) ). 不过需要预装 Python 的一些包,如 numpy, scikit-learn等,才能正常 `import caffe`.

        sudo apt-get install python-numpy python-matplotlib python-sklearn python-scipy python-skimage python-h5py python-protobuf python-leveldb python-networkx python-nose python-pandas python-gflags Cython ipython
        sudo apt-get update
参考 [caffe examples](http://nbviewer.jupyter.org/github/BVLC/caffe/tree/master/examples/), 我们把 .ipynb 文件转换为 .py 文件并用 ipyhon 执行, 如果用 python 执行会出现 [错误](https://stackoverflow.com/questions/32538758/nameerror-name-get-ipython-is-not-defined)。

        jupyter nbconvert --to script '00-classfication.ipynb'
        ipython 00-classfication.py
但用ipython仍然遇到了一个 ImportError 的错误 

[图片上传失败...(image-82cc64-1515046033856)]

[mnist](http://caffe.berkeleyvision.org/gathered/examples/mnist.html)
  • Q3   什么样的 layer 才能它的 bottom 和 top 可以是相同的名称?

    Answer:  目前只有 Relu 层它的上下层可以使用相同名称,因为它是 element-wise 的,所以可以使用 in-place 的操作以节省内存。 (具体)

------------------------------------

caffe matlab接口使用


读取训练好的net参数

    caffe.reset_all();
    clear; close all;

    % settings
    model = '*.prototxt'
    weights = '*.caffemodel'

    % load model using mat_caffe
    net = caffe.Net(model, weights, 'test');    

在界面中可以看到,net 含有以下参数
[图片上传失败...(image-dec443-1515046033856)]

BatchNorm 层的三个blob含义分别为 MEAN, VARIANCE, MOVING AVERAGE FACTOR

caffe python 接口使用

首先我们定义一个简单的卷积网络

name: "myconvnet"
input: "data"
input_dim: 1
input_dim: 1
input_dim: 256
input_dim: 256

layer {
  name: "conv"
  type: "Convolution"
  bottom: "data"
  top: "conv"
  convolution_param {
    num_output: 10
    kernel_size: 3
    stride: 1
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

为了保证自己定义的网络各层之间的连接没有问题,我们可以将它可视化来检查网络,看它是什么样子的。 这需要安装一些依赖的包

$ pip insall pydot
$ sudo apt-get install graphviz libgraphviz-dev
$ pip install pygraphviz

然后,就可以用 caffe 自带的 python 脚本画出自定义的网络

$ python /path/to/caffe/python/draw_net.py myconvnet.prototxt myconvnet.png 

打开 myconvnet.png 就可以看到画出的网络
[图片上传失败...(image-768175-1515046033856)]

下面说一说怎么用 Python 调用训练好的网络来做测试。首先,创建一个 net 对象来容纳我们的卷积网络:

impoort sys
sys.path.insert(0, '/path/to/caffe/python')
import numpy as np
import cv2
from pylab import *  #画图

import caffe
#initialize
caffe.set_device(1)     #指定使用哪一块GPU
caffe.set_mode_gpu()    #指定GPU计算

model_def = 'deploy.prototxt'   #给定网络模型
model_weight = 'net.cafffemodel'    #给定参数
net = caffe.Net(model_def, model_weight, caffe.TEST)        #给定phase = TEST, 那么网络只会向前计算,不会 backpropagation
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容