前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Caffe-Python-自定义网络 原

Caffe-Python-自定义网络 原

作者头像
Pulsar-V
发布2019-03-12 16:59:19
5400
发布2019-03-12 16:59:19
举报
文章被收录于专栏:Pulsar-VPulsar-V

这里我们用一个例子先来体验一下

  • 首先定义一下我们的环境变量 $PYTHONPATH,我这儿是Windows开发环境,至于Windows Caffe怎么编译由读者自己下去搞定

我使用的控制台是 Windows PowerShell

添加环境变量

代码语言:javascript
复制
$env:PATHPATH="F:\caffe-python\python\;F:\caffe-windows\windows\install\python"

这里F:\caffe-python\python 是我的新Layer的路径F:\caffe-windows\windows\install\python 是我的Caffe编译以后install的路径

编写自己的TestLayer

代码语言:javascript
复制
import caffe
import numpy as np
class TestLayer(caffe.Layer):
    def setup(self, bottom, top):
        if len(bottom) != 1:
            raise Exception("Need two inputs to compute distance.")

    def reshape(self, bottom, top):
        print("-----------------1---------------------")
        top[0].reshape(1)

    def forward(self, bottom, top):
        top[0].data[...] = bottom[0].data
        print("-----------------2---------------------")
    def backward(self, top, propagate_down, bottom):
        bottom[...].data=top[0].data
        pass
  • 官方给出的一个例子
代码语言:javascript
复制
import caffe
import numpy as np

class EuclideanLossLayer(caffe.Layer):

    def setup(self, bottom, top):
        # 输入检查
        if len(bottom) != 2:
            raise Exception("Need two inputs to compute distance.")

    def reshape(self, bottom, top):
        # 输入检查
        if bottom[0].count != bottom[1].count:
            raise Exception("Inputs must have the same dimension.")
        # 初始化梯度差分zeros_like函数的意义是创建一个与参数等大小的全0矩阵
        self.diff = np.zeros_like(bottom[0].data, dtype=np.float32)
        # loss 输出(loss是一个标量)
        top[0].reshape(1)
		
	#前向传播(计算loss bottom[0].data是第一个输入 bottom[1].data是第二个输入)
	#注意:前向传播是输出top
    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.
	#后向传播
	#注意:前向传播是输出到bottom
    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

编写完我们的ayers以后写出网络结构

代码语言:javascript
复制
name: "TEST"
layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mean_file: "examples/cifar10/Release/cifar10/mean.binaryproto"
  }
  data_param {
    source: "examples/cifar10/Release/cifar10/cifar10_train_lmdb"
    batch_size: 100
    backend: LMDB
  }
}
layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mean_file: "examples/cifar10/Release/cifar10/mean.binaryproto"
  }
  data_param {
    source: "examples/cifar10/Release/cifar10/cifar10_test_lmdb"
    batch_size: 100
    backend: LMDB
  }
}
layer {
  name: "test1"
  type: "Python"
  bottom: "data"
  top: "test1"
  python_param {
    module: "test_layer"
    layer: "Test_Layer"
  }
}

可视化我们的网络结构以后如图

编写solver

代码语言:javascript
复制
net: "F:/caffe-python/python/test_layer.prototxt"
base_lr: 0.001
lr_policy: "fixed"
max_iter: 10
solver_mode: CPU

接下来在powershell里面去启动caffe 先cd到caffe所在的目录 我的目录是这样的

代码语言:javascript
复制
cd F:\Smart_Classroom\3rdparty\ALLPLATHFORM\caffe-windows\windows\examples\cifar10\Release

然后执行caffe

代码语言:javascript
复制
./caffe.exe train --solver=F:/caffe-python/python/test_python_layer_solver.prototxt

如下图:

在后向和前向传播的过程中我们成功的调用了两个print 至此,编写自己的Caffe层就成功了

PS: 编写的时候严格注意路径否则会出现以下报错

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/12/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 添加环境变量
  • 编写自己的TestLayer
  • 编写完我们的ayers以后写出网络结构
  • 编写solver
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档