【caffe2从头学】:3.3.Brewing Models(快速构建模型)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37251044/article/details/82425057

本片文章是我的【caffe2从头学】系列中的一篇,如果想看其他文章,请看目录:


0.目录
1.快速开始

1.1.什么是caffe2 ?
1.2.安装caffe2

2.学习caffe2
3.caffe2官方教程的安装与使用

3.1.Blobs and Workspace, Tensors,Net 概念
3.2.Caffe2 的一些基本概念 - Workspaces&Operators & Nets & Nets 可视化
3.3.Brewing Models(快速构建模型)
3.4.Toy_Regression
3.5.Models and Datasets
3.6.Loading_Pretrained_Models
3.7.Image_Pre-Processing_Pipeline
3.8.MNIST
3.9.create_your_own_dataset

4.参考
5.API

相关代码在我的github仓库:https://github.com/JackKuo666/csdn/tree/master/caffe2


本页来自:https://caffe2.ai/docs/brew

1.Brewing Models

brew是Caffe2用于构建模型的新API。CNNModelHelper过去曾在caffe里担任过这个角色,但由于Caffe2的扩展远远超出了CNN的优势,因此提供更通用的ModelHelper对象是有意义的。您可能会注意到新的ModelHelperCNNModelHelper具有许多相同的功能。 brew包装了新的ModelHelper,使得构造模型(model)比以前更容易。

2.Model Building and Brew’s Helper Functions

在本概述中,我们将介绍brew,一个轻量级的辅助函数(Helper Functions)集合,可帮助您构建模型。
  1.我们将首先解释OpsHelper Functions的关键概念。
  2.然后我们将展示brew使用情况,它如何充当ModelHelper对象的接口,以及arg_scope语法糖。
  3.最后,我们讨论了引入brew的动机。

3.Concepts: Ops vs Helper Functions

在我们深入研究brew之前,我们应该回顾caffe2中的一些约定以及神经网络层是如何表示的。caffe2的深度学习网络net是由操作符operators建立的。通常,这些操作符operators是用c++编写的,以获得最大的性能。caffe2还提供了一个Python API来包装这些c++操作符operators,因此您可以更灵活地进行实验和原型设计。在caffe2中,操作符operators总是以骆驼拼写法( CamelCase fashion)的形式出现,而具有类似名称的Python helper functions是小写的。下面是一些例子。

扫描二维码关注公众号,回复: 3310596 查看本文章

3.1.Ops

我们经常将操作符operator称为Op或运算符集合operators作为Ops。例如,FC Op代表一个完全连接的运算符,它与前一层中的每个神经元和下一层的每个神经元都有加权连接。例如,您可以使用以下命令创建FC Op

model.net.FC([blob_in, weights, bias], blob_out)

或者您可以创建一个Copy Op

model.net.Copy(blob_in, blob_out)

ModelHelper处理的操作符operators列表在本文档的底部,目前包括最常用的29个。这是写这篇文章时的400+ Ops caffe2的一个子集。

还应注意,您还可以创建一个没有注释网络的operator。例如,就像我们创建Copy Op的前一个示例一样,我们可以使用以下代码在model.net上创建一个Copy运算符:

model.Copy(blob_in, blob_out)

3.2.Helper Functions

仅仅使用单个operator来构建模型/网络可能很费劲,因为您必须自己完成参数初始化,设备/引擎选择(但这也是Caffe2如此之快的原因!)。例如,要构建FC层,您需要使用几行代码来准备权重和偏差,然后将其提供给Op

这是更长的手动方式:

model = model_helper.ModelHelper(name="train")
# initialize your weight
weight = model.param_init_net.XavierFill(
    [],
    blob_out + '_w',
    shape=[dim_out, dim_in],
    **kwargs, # maybe indicating weight should be on GPU here
)
# initialize your bias
bias = model.param_init_net.ConstantFill(
    [],
    blob_out + '_b',
    shape=[dim_out, ],
    **kwargs,
)
# finally building FC
model.net.FC([blob_in, weights, bias], blob_out, **kwargs)

幸运的是,Caffe2helper functions可以提供帮助。helper functions是包装函数,可为模型(model)创建完整的层(layer)。helper functions通常用于处理参数初始化,operator定义和引擎选择。 Caffe2默认helper functions在Python PEP8函数约定中命名。例如,使用python / helpers / fc.py,通过helper functions fc实现FC Op要简单得多:
  使用helper functions的更简单方法:

fcLayer = fc(model, blob_in, blob_out, **kwargs) # returns a blob reference

一些helper functions构建了多于1个operator。例如,python/rnn_cell.py中的LSTM函数可帮助您在网络中构建整个LSTM单元。

查看repo以获得更酷的帮助函数!

4.brew

现在你已经了解了OpsHelper功能,让我们来介绍一下brew如何使模型构建变得更加容易。 brew是一个智能的辅助函数helper functions集合。只需导入一个brew模块,即可使用所有Caffe2强大的helper functions功能。您现在可以使用以下方法添加FC层:

from caffe2.python import brew

brew.fc(model, blob_in, blob_out, ...)

这与直接使用helper functions几乎相同,但是一旦模型变得更复杂,brew就会开始闪耀。以下是从MNIST教程中提取的LeNet模型构建示例。

rom caffe2.python import brew

def AddLeNetModel(model, data):
    conv1 = brew.conv(model, data, 'conv1', 1, 20, 5)
    pool1 = brew.max_pool(model, conv1, 'pool1', kernel=2, stride=2)
    conv2 = brew.conv(model, pool1, 'conv2', 20, 50, 5)
    pool2 = brew.max_pool(model, conv2, 'pool2', kernel=2, stride=2)
    fc3 = brew.fc(model, pool2, 'fc3', 50 * 4 * 4, 500)
    fc3 = brew.relu(model, fc3, fc3)
    pred = brew.fc(model, fc3, 'pred', 500, 10)
    softmax = brew.softmax(model, pred, 'softmax')

每个层都是使用brew创建的,而brew又使用其operator hooks来实例化每个Op

4.1.arg_scope

arg_scope是一种语法糖,可以在其上下文中设置默认的helper functions参数值。例如,假设您想在ResNet-150训练脚本中尝试不同的权重初始化。你可以:

# change all weight_init here
brew.conv(model, ..., weight_init=('XavierFill', {}),...)

# repeat 150 times

brew.conv(model, ..., weight_init=('XavierFill', {}),...)

或者在arg_scope的帮助下,你可以:

with brew.arg_scope([brew.conv], weight_init=('XavierFill', {})):
     brew.conv(model, ...) # no weight_init needed here!
     brew.conv(model, ...)
     ...

5.Custom Helper Function

当您更频繁地使用brew并且发现需要实现Brew目前不涵盖的Op时,您将需要编写自己的Helper Function。您可以将您自己的Helper Function注册为brew,以享受统一管理和语法糖。
  只需定义新的Helper Function,使用.Register函数将其注册到brew,然后使用brew.new_helper_function调用它。

def my_super_layer(model, blob_in, blob_out, **kwargs):
"""
   100x faster, awesome code that you'll share one day.
"""

brew.Register(my_super_layer)
brew.my_super_layer(model, blob_in, blob_out)

6.Caffe2 Default Helper Functions

请访问:https://caffe2.ai/docs/brew

accuracy
add_weight_decay
average_pool
concat
conv
conv_nd
conv_transpose
depth_concat
dropout
fc
fc_decomp
fc_prune
fc_sparse
group_conv
group_conv_deprecated
image_input
instance_norm
iter
lrn
max_pool
max_pool_with_index
packed_fc
prelu
softmax
spatial_bn
relu
sum
transpose
video_input

7.Motivation for brew

感谢您阅读有关brew的全部概述!恭喜你,你终于来了!简而言之,我们希望将模型构建过程和模型存储分开。在我们看来,ModelHelper类应该只包含网络定义和参数信息。 brew模块将具有构建网络和初始化参数的功能。

与之前同时进行模型存储模型构建的巨型CNNModelHelper相比,模型构建的ModelHelper + brew方式更加模块化,更易于扩展。在命名方面,由于Caffe2系列支持各种网络,包括MLP,RNN和CNN,因此它也更不容易混淆。 我们希望本教程能够帮助您更快,更轻松地建立模型,同时更深入地了解Caffe2。python/brew_test.py中有一个brew使用的详细示例。如果您对brew有任何疑问,请随时与我们联系并在回购问题中提出问题。再次感谢您拥抱新的brew API。

猜你喜欢

转载自blog.csdn.net/weixin_37251044/article/details/82425057