文档章节

Caffe(二)-Python-自定义网络

Pulsar-V
 Pulsar-V
发布于 2018/12/16 22:17
字数 715
阅读 32
收藏 0

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

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

我使用的控制台是 Windows PowerShell

添加环境变量

$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

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
  • 官方给出的一个例子

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以后写出网络结构

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

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所在的目录
我的目录是这样的

cd F:\Smart_Classroom\3rdparty\ALLPLATHFORM\caffe-windows\windows\examples\cifar10\Release

然后执行caffe

./caffe.exe train --solver=F:/caffe-python/python/test_python_layer_solver.prototxt

如下图:

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

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

© 著作权归作者所有

共有 人打赏支持
Pulsar-V

Pulsar-V

粉丝 52
博文 111
码字总数 82567
作品 1
成都
后端工程师
私信 提问
在Caffe中加Python Layer的方法

Author: Zongwei Zhou | 周纵苇 Weibo: @MrGiovanni Email: zongweiz@asu.edu Acknowledgement: Md Rahman Siddiquee (mrahmans@asu.edu) Caffe的参考文档非常少,自己改代码需要查阅网上好多......

MrGiovanni
2017/11/27
0
0
caffe网络可视化的多种方式

版权声明:本文为博主 一銤阳光 学习整理的文章,如需转载,请注明出处、附上CSDN博文链接。 https://blog.csdn.net/CSDNhuaong/article/details/83689622 文章目录 写在前面 在caffe网络的训...

一銤阳光
2018/11/03
0
0
[Notes]深度学习——caffe工具使用

本篇文章是我利用 caffe进行深度学习的知识点总结,包含别人学习笔记链接 caffe简介 caffe的作者为UC Berkeley大学的贾扬清。caffe是一个c++/CUDA架构,支持命令行、Python、Matlab接口,可以...

nanbei2463776506
2018/04/24
0
0
机器学习和深度学习的最佳框架大比拼

在过去的一年里,咱们讨论了六个开源机器学习和/或深度学习框架:Caffe,Microsoft Cognitive Toolkit(又名CNTK 2),MXNet,Scikit-learn,Spark MLlib和TensorFlow。如果把网撒得大些,可...

凝小紫
2017/02/05
26.9K
3
Caffe--计算数据集的图像均值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwplwf/article/details/82417616 特征标准化(使数据集中所有特征都具有零均值和单位方差)。 零均值:计算每...

零尾
2018/09/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
24分钟前
0
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
25分钟前
0
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
41分钟前
2
0
IntelliJ IDEA 第一个 Scala 程序

IntelliJ 安装完成 Scala 插件后,你需要尝试使用 IntelliJ 来创建并且运行第一个程序。 通常这个程序只是简单的输出 Hello World。 创建一个新工程 在文件下面选择新建,然后选择创建工程。...

honeymose
46分钟前
2
0
csapp 习题 - 如何实现异或 exclusive-or

阅读 csapp v3 时,练习题 2.13 很有意思。练习题描述如下。 位设置是对于参数 mask 中每一个为 1 的位,那么参数 x 中相应位则被设置为 1 ;位清除是对于参数 mask 中每一个为 1 的位,那么...

ylme
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部