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

Pulsar-V

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

# 添加环境变量

``````\$env:PATHPATH="F:\caffe-python\python\;F:\caffe-windows\windows\install\python"
``````

# 编写自己的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
``````

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

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

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

### Pulsar-V

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

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

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

nanbei2463776506
2018/04/24
0
0

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

2018/09/05
0
0

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

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

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

ylme

6
0