Caffe

2018-01-04  本文已影响0人  我的白衣年代

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

- Vision layer

- Recurrent Layers

- Common Layers

- Normalization Layers

- Activation Layers

- Utility Layers

- Loss Layers

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 使用问题集锦

- 使用 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)

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

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
上一篇下一篇

猜你喜欢

热点阅读