Caffe资料


安装

MacOSX

brew install -vd snappy leveldb gflags glog szip lmdb
# need the homebrew science source for OpenCV and hdf5
brew tap homebrew/science
brew install hdf5 opencv
# with Python pycaffe needs dependencies built from source
brew install --build-from-source --with-python -vd protobuf
brew install --build-from-source -vd boost boost-python
# without Python the usual installation suffices
brew install protobuf boost

OS X Installation

以下是常见问题: - fatal error: ‘numpy/arrayobject.h’ file not found,这是因为无法找到np路径

import numpy as np
np.get_include()
修改如下:
# We need to be able to find Python.h and numpy/arrayobject.h.
PYTHON_INCLUDE := /usr/include/python2.7 \
/usr/local/lib/python2.7/site-packages/numpy/core/include

Mac下配置Caffe的Python接口 - 无boost-python问题 需要安装的boost为1.57.0版本,修改brew boost和boost-python改为1.57.0即可

brew edit boost
brew edit boost-python
修改为如下地址即可
url "https://downloads.sourceforge.net/project/boost/boost/1.57.0/boost_1_57_0.tar.bz2"
sha256 "910c8c022a33ccec7f088bd65d4f14b466588dda94ba2124e78b8c57db264967"
export PYTHONPATH=$PYTHONPATH:$HOME/GitHub/GitWeb/caffe/python

boost –with-python required on osx for pycaffe target #465 - Attempt to free invalid pointer

# USE_LEVELDB := 0

相关资料

记录caffe相关学习和模型。


caffe2

Caffe2是一个轻量级,模块化和可扩展的深度学习框架。 Caffe2以原始Caffe为基础,在设计时考虑了表达,速度和模块性。提倡”CODE ONCE, RUN ANYWHERE”和”from zero to scale, cloud to mobile”。

Caffe2旨在为您提供一种简单直接的方式来体验深度学习,并利用新模型和算法的社区贡献。您可以使用云中的GPU或通过Caffe2的跨平台库在移动设备上实现大规模扩展。

Caffe2在一系列方向上改善了Caffe 1.0 - 一流的大规模分布式培训支持 - 移动部署 新的硬件支持(除了CPU和CUDA) - 灵活的未来方向,如量化计算 - 受到大量Facebook应用程序的压力测试

Caffe2中计算的基本单位之一是运算符。您可以将这些视为Caffe中更灵活的图层版本。 Caffe2拥有400多家不同的运营商,为社区提供指导,帮助他们创造并为这一不断增长的资源做出贡献。有关更多信息,请查看操作员信息并浏览介绍教程。

从原始Caffe转换模型相对容易。我们在下面提供了一个可以转换您的caffemodel的教程,但您仍需要验证准确度和loss是否在范围内或更好。

caffe和caffe2模型互相转换,请参考caffe_translator.py

PyTorch转换为caffe2,首先参考Github torch2caffe将PyTorch模型转换为caffe,然后根据上述caffe和caffe2模型互相转换方法转换即可。

Operators概述

Caffe2中的一个基本计算单位是Operators。每个运算符包含在给定适当数量和类型的输入和参数的情况下计算输出所需的逻辑。Caffe和Caffe2中Operators功能的总体差异分别如下图所示,例如,在全连接的运算符中,必须提供输入X,偏置b和权重矩阵W中的每一个,并且计算输出为单个:

Caffe2同时支持稀疏运算符,具体参考Guide for sparse operations,另外可以实现自定义运算符,具体参考Guide for creating your own operators

Caffe2概念

Blobs and Workspace, Tensors

Caffe2中的数据被组织为blob。一个blob只是在内存中的数据块命名。大多数blob包含一个张量(想想多维数组),在Python中它们被转换为numpy数组(numpy是一个流行的Python数值库,已经作为Caffe2的先决条件安装)。

一个工作空间存储所有的blobs。以下示例显示如何将blob提供给a workspace并再次获取它们。工作区在您开始使用它们的那一刻初始化。

from caffe2.python import workspace, model_helper
import numpy as np
# Create random tensor of three dimensions
x = np.random.rand(4, 3, 2)
print(x)
print(x.shape)

workspace.FeedBlob("my_x", x)

x2 = workspace.FetchBlob("my_x")
print(x2)

Nets and Operators

Caffe2中的基本模型抽象是网络(网络的简称)。网络是运算符的图形,每个运算符采用一组输入blob并生成一个或多个输出blob。

直接编写网络非常繁琐,因此最好使用有助于创建网络的Python类模型助手。即使我们调用它并传入一个名称“我的第一个网”,ModelHelper也会创建两个相互关联的网:

  1. 一个初始化参数(参考init_net)
  2. 一个运行实际训练的人(参考exec_net)
# 随机创建data和label并作为blob提供给工作区workspace
# Create the input data
data = np.random.rand(16, 100).astype(np.float32)

# Create labels for the data as integers [0, 9].
label = (np.random.rand(16) * 10).astype(np.int32)

workspace.FeedBlob("data", data)
workspace.FeedBlob("label", label)

# 使用模型类创建模型
# Create model using a model helper
m = model_helper.ModelHelper(name="my first net")

现在用model_helper来创建我们前面提到过的两个网(init_net和exec_net)。我们计划FC接下来使用此模型中的运算符添加完全连接的图层,但首先我们需要通过创建随机填充的blob来进行准备工作,以获得FC运算符期望的权重和偏差。当我们添加FC运算符时,我们将通过名称引用权重和偏差blob作为输入。

weight = m.param_init_net.XavierFill([], 'fc_w', shape=[10, 100])
bias = m.param_init_net.ConstantFill([], 'fc_b', shape=[10, ])

# 创建net,其中将FC运算符中的输入列表补充完全
fc_1 = m.net.FC(["data", "fc_w", "fc_b"], "fc1")
pred = m.net.Sigmoid(fc_1, "pred")
softmax, loss = m.net.SoftmaxWithLoss([pred, "label"], ["softmax", "loss"])

# 最后查看网络存储结构
print(m.net.Proto())

Executing

现在,当我们定义模型训练操作符时,我们可以开始运行它来训练我们的模型。首先,我们只运行一次param初始化:

workspace.RunNetOnce(m.param_init_net)
workspace.CreateNet(m.net)

# 一次创建网络多次有效地运行
# Run 100 x 10 iterations
for _ in range(100):
    data = np.random.rand(16, 100).astype(np.float32)
    label = (np.random.rand(16) * 10).astype(np.int32)

    workspace.FeedBlob("data", data)
    workspace.FeedBlob("label", label)
# 注意我们如何通过m.name而不是通过网络定义本身RunNet()。由于网络是在工作空间内创建的,因此我们不需要再次传递定义。
    workspace.RunNet(m.name, 10)   # run for 10 times

# 执行后,您可以检查存储在输出blob中的结果(包含张量即numpy数组):
    print(workspace.FetchBlob("softmax"))
    print(workspace.FetchBlob("loss"))

BP反向传播

这个网络只包含前向传播,因此它不会学习任何东西。通过在前向传递中为每个运算符添加梯度运算符来创建向后传递。

参考资料