caffe层中,数据输入层type="Python",使用方法用Python写自己的layer

用Python写自己的layer

Python layer in Caffe can speed up development process Issue1703

Compile WITH_PYTHON_LAYER option

First, you have to build Caffe with WITH_PYTHON_LAYER option 1. Run make clean to delete all the compiled binaries. Then,

WITH_PYTHON_LAYER=1 make && make pycaffe
      
      

    If you skip this, caffe will complain that layer factory function can’t find Python layer.

    layer_factory.hpp:77] Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Python
          
          

      Python Layer

      A gist from Evan Shelhamer summarizes the basics of the python layer.

      ... 
      layer {
      type: 'Python'
      name: 'loss'
      top: 'loss'
      bottom: 'ipx'
      bottom: 'ipy'
      python_param {
      # the module name -- usually the filename -- that needs to be in $PYTHONPATH
      module: 'pyloss'
      # the layer name -- the class name in the module
      layer: 'EuclideanLossLayer'
      }
      # set loss weight so Caffe knows this is a loss layer
      loss_weight: 1
      }
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15

      You have to define a python layer that is defined in your $PYTHONPATH. In the prototxt, the module is pyloss, which means that the file that contains the EuclideanLossLayer should be named pyloss.py.

      import caffe
      import numpy as np
      
      class EuclideanLossLayer(caffe.Layer):
      
          def setup(self, bottom, top):
              # check input pair
              if len(bottom) != 2:
                  raise Exception("Need two inputs to compute distance.")
      
          def reshape(self, bottom, top):
              # check input dimensions match
              if bottom[0].count != bottom[1].count:
                  raise Exception("Inputs must have the same dimension.")
              # difference is shape of inputs
              self.diff = np.zeros_like(bottom[0].data, dtype=np.float32)
              # loss output is scalar
              top[0].reshape(1)
      
          def forward(self, bottom, top):
              self.diff[...] = bottom[0].data - bottom[1].data
              top[0].data[...] = np.sum(self.diff**2) / bottom[0].num / 2.
      
          def backward(self, top, propagate_down, bottom):
              for i in range(2):
                  if not propagate_down[i]:
                      continue
                  if i == 0:
                      sign = 1
                  else:
                      sign = -1
                  bottom[i].diff[...] = sign * self.diff / bottom[i].num
       
       
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-448c2d19d9.css" rel="stylesheet">
                  </div>
      								
      				<script>
      					(function(){
      						function setArticleH(btnReadmore,posi){
      							var winH = $(window).height();
      							var articleBox = $("div.article_content");
      							var artH = articleBox.height();
      							if(artH > winH*posi){
      								articleBox.css({
      									'height':winH*posi+'px',
      									'overflow':'hidden'
      								})
      								btnReadmore.click(function(){
      									articleBox.removeAttr("style");
      									$(this).parent().remove();
      								})
      							}else{
      								btnReadmore.parent().remove();
      							}
      						}
      						var btnReadmore = $("#btn-readmore");
      						if(btnReadmore.length>0){
      							if(currentUserName){
      								setArticleH(btnReadmore,3);
      							}else{
      								setArticleH(btnReadmore,1.2);
      							}
      						}
      					})()
      				</script>
      				</article>
      
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值