当前位置: 首页 > 面试题库 >

caffe中的“ Python”层是什么?

南宫勇军
2023-03-14
问题内容

Caffe具有图层类型"Python"

例如,该层类型可以用作损耗层。
在其他情况下,它用作输入层。

这是什么层类型?
该层如何使用?


问题答案:

Prune和Bharat的答案给出了一个"Python"层的总体目的:一个通用层,它是用python而不是c
++实现的。

我打算将此答案作为使用"Python"图层的教程。

"Python"图层教程

什么是"Python"层?

请查看Prune和Bharat的出色回答。

前提条件

为了使用'Python"图层,您需要使用flag编译caffe

WITH_PYTHON_LAYER := 1

设置在'Makefile.config'

如何实现"Python"一层?

"Python"层应被实现为衍生自Python类caffe.Layer基类。此类 必须 具有以下四个方法:

import caffe
class my_py_layer(caffe.Layer):
  def setup(self, bottom, top):
    pass

  def reshape(self, bottom, top):
    pass

  def forward(self, bottom, top):
    pass

  def backward(self, top, propagate_down, bottom):
    pass

这些方法是什么?

def setup(self, bottom, top)
:当caffehtml" target="_blank">构建网络时,将一次调用此方法。此功能应检查输入数量(len(bottom))和输出数量(len(top))是否符合预期。
您还应该在此处分配网络的内部参数(即self.add_blobs()),有关更多信息,请参见此线程。
此方法可以访问self.param_str-从原型文件传递到图层的字符串。有关更多信息,请参见此线程。

def reshape(self, bottom, top)
:每当caffe重塑网络时,都会调用此方法。此函数应分配输出(每个topBlob)。输出的形状通常与bottoms的形状有关。

def forward(self, bottom, top) :实施从bottom到的向前传递top

def backward(self, top, propagate_down, bottom)
:此方法实现了反向传播,将梯度从传播topbottompropagate_down是一个布尔向量,len(bottom)指示bottom应将梯度传播到s中的哪一个。

您可以在这篇文章中找到有关的更多信息bottomtop输入。

示例
您可以在此处,此处和此处看到一些简化的python层示例。
可以在此处找到“移动平均值”输出层的示例。

可训练参数
"Python"层可以具有可训练参数(如"Conv""InnerProduct"等)。
您可以在此线程和此线程中找到有关添加可训练参数的更多信息。在caffe
git中也有一个非常简化的示例。

如何"Python"在原型文件中添加图层?

有关详细信息,请参见Bharat的答案。
您需要将以下内容添加到您的原型中:

layer {
  name: 'rpn-data'
  type: 'Python'  
  bottom: 'rpn_cls_score'
  bottom: 'gt_boxes'
  bottom: 'im_info'
  bottom: 'data'
  top: 'rpn_labels'
  top: 'rpn_bbox_targets'
  top: 'rpn_bbox_inside_weights'
  top: 'rpn_bbox_outside_weights'
  python_param {
    module: 'rpn.anchor_target_layer'  # python module name where your implementation is
    layer: 'AnchorTargetLayer'   # the name of the class implementation
    param_str: "'feat_stride': 16"   # optional parameters to the layer
  }
}

如何"Python"使用pythonicNetSpec界面添加图层?

很简单:

import caffe
from caffe import layers as L

ns = caffe.NetSpec()
# define layers here...
ns.rpn_labels, ns.rpn_bbox_targets, \
  ns.rpn_bbox_inside_weights, ns.rpn_bbox_outside_weights = \
    L.Python(ns.rpn_cls_score, ns.gt_boxes, ns.im_info, ns.data, 
             name='rpn-data',
             ntop=4, # tell caffe to expect four output blobs
             python_param={'module': 'rpn.anchor_target_layer',
                           'layer': 'AnchorTargetLayer',
                           'param_str': '"\'feat_stride\': 16"'})

如何使用一层网"Python"

您无需担心从caffe调用python代码。Caffe使用boost API从编译的c ++调用python代码。
您需要做什么?
确保实现您的图层的python模块在其中,$PYTHONPATH以便在caffeimport时可以找到它。
举例来说,如果你的模块my_python_layer.py/path/to/my_python_layer.py,然后

PYTHONPATH=/path/to:$PYTHONPATH $CAFFE_ROOT/build/tools/caffe train -solver my_solver.prototxt

应该工作正常。

如何测试我的图层?

在使用该图层之前,应始终对其进行测试。
测试forward功能完全取决于您,因为每个层都有不同的功能。
测试该backward方法很 容易 ,因为该方法仅实现了一个渐变,forward可以自动进行数值测试!
签出test_gradient_for_python_layer测试实用程序:

import numpy as np
from test_gradient_for_python_layer import test_gradient_for_python_layer

# set the inputs
input_names_and_values = [('in_cont', np.random.randn(3,4)), 
                          ('in_binary', np.random.binomial(1, 0.4, (3,1))]
output_names = ['out1', 'out2']
py_module = 'folder.my_layer_module_name'
py_layer = 'my_layer_class_name'
param_str = 'some params'
propagate_down = [True, False]

# call the test
test_gradient_for_python_layer(input_names_and_values, output_names, 
                               py_module, py_layer, param_str, 
                               propagate_down)

# you are done!

特别通知

值得一提的是,python代码仅在CPU上运行。因此,如果您计划在网络 中间 放置一个Python层,那么当您计划使用GPU时,性能将会 大大
下降。发生这种情况是因为caffe需要在调用python层之前将blob从GPU复制到CPU,然后再复制回GPU才能进行向前/向后传递。
如果python层是输入层或最顶层的损失层,则这种降级的意义就不那么明显了。
更新:
2017年9月19日,PR#5904合并为master。此PR通过python接口公开blob的GPU指针。您可以直接从python直接访问blob._gpu_data_ptr和blob._gpu_diff_ptr,后果
自负



 类似资料:
  • 问题内容: 在解析了许多有关在Python中构建Caffe层的链接之后,我仍然很难理解一些概念。可以请别人澄清一下吗? 网络的Blob和权重python结构在这里进行了解释:查找关于输入的Caffe转换滤波器的梯度。 网络和求解器的结构在这里说明:Caffe / Pycaffe速查表?。 定义python层的示例在这里:git上的pyloss.py。 此处进行层测试:在git上测试层。 此处介绍了

  • 本文向大家介绍ThinkPHP中的MVC分层是什么?相关面试题,主要包含被问及ThinkPHP中的MVC分层是什么?时的应答技巧和注意事项,需要的朋友参考一下 MVC 是一种将应用程序的逻辑层和表现层进行分离的方法。ThinkPHP 也是基于MVC设计模式的。MVC只是一个抽象的概念,并没有特别明确的规定,ThinkPHP中的MVC分层大致体现在: 模型(M):模型的定义由Model类来完成。 控

  • 问题内容: CSS中“层叠”一词的确切含义是什么?我有不同的看法,所以我在这里问。一个例子会有所帮助。 问题答案: 在此上下文中,“级联”意味着,由于一个样式表声明可以应用于一个特定的HTML片段,因此必须有一种确定哪种特定样式表规则应用于哪个HTML片段的已知方法。 通过从更一般的声明向下层叠到所需的特定规则来选择所使用的规则。选择最具体的声明。

  • Caffe 是一个深度学习框架,由表达式,速度和模块化组成。Caffe 是 Berkeley Vision and Learning Center (BVLC) 社区贡献者开发的。在线演示: http://demo.caffe.berkeleyvision.org。国人开发的 Caffe GUI 工具:Huabot Brain。

  • 问题内容: 元类是什么,我们将它们用于什么? 问题答案: 元类是类的类。类定义类的实例(即对象)的行为,而元类定义类的行为。类是元类的实例。 虽然在Python中你可以对元类使用任意可调用对象(例如Jerub演示),但是更好的方法是使其成为实际的类。是Python中常见的元类。它本身是一个类,并且是它自己的类型。你将无法纯粹使用Python 重新创建类似的东西,但是Python有点作弊。要在Pyt

  • 问题内容: 我试图了解TimeDistributed包装器在Keras中的作用。 我得到了TimeDistributed“将层应用于输入的每个时间片”。 但是我做了一些实验,却得到了我无法理解的结果。 简而言之,对于LSTM层,TimeDistributed和Just Dense层的结果相同。 对于这两个模型,我得到的输出形状为 (None,10,1) 。 在RNN层之后,谁能解释TimeDist