背景:MTCNN的prelu需要训练,并且prelu需要有参数。prelu改为relu之后,相应的参数量会降低并且实现也更简单。

目的:更改MTCNN的prelu为ReLU,并在python端训练出相应的代码,c端结构改为与python端一致。

参考相关:

MTCNN(三)基于python代码的网络结构更改 https://blog.csdn.net/weixin_36474809/article/details/82856171

MTCNN(一)训练与运行  https://blog.csdn.net/weixin_36474809/article/details/82752199

目录

一、python端结构的更改与参数训练

1.1 更改的位置

1.2 实验结果

1.3 重新训练与测试

Pnet

Rnet

Onet

二、采用网络结构表

Pnet

Rnet

Onet

三、c代码端结构的更改

3.1 函数的定义

3.2 网络的更改

一、python端结构的更改与参数训练

1.1 更改的位置

更改前的prelu

@layer

def prelu(self, inp, name):

with tf.variable_scope(name):

i = int(inp.get_shape()[-1])

alpha = self.make_var('alpha', shape=(i,))

return tf.nn.relu(inp) + tf.multiply(alpha, -tf.nn.relu(-inp))

加上relu

@layer

def relu(self, inp, name):

return tf.nn.relu(inp, name=name)

然后把pnet/rnet/onet中的prelu函数全部改为relu函数。

这里批评一下Notepad++之中的空格总是与python需要的空格不一致。每次编辑好之后还要用spyder再进行一次空格,免得报错。IndentationError: unexpected unindent

网络结构定义之中的更改:prelu改为了relu,(层的名字方便起见暂时没有更改)

class PNet(NetWork):

def setup(self, task='data', reuse=False):

with tf.variable_scope('pnet', reuse=reuse):

(

self.feed(task) .conv(

3,

3,

10,

1,

1,

padding='VALID',

relu=False,

name='conv1') .relu(

name='ReLU1') .conv(

3,

3,

16,

2,

2,

padding='SAME',

relu=False,

name='pool1_conv1') .relu(

name='pool1_ReLU1') .conv(

3,

3,

32,

1,

1,

padding='VALID',

relu=False,

name='conv2') .relu(

name='ReLU2') .conv(

3,

3,

32,

1,

1,

task=task,

padding='VALID',

relu=False,

name='conv3',

wd=self.weight_decay_coeff) .relu(

name='ReLU3'))

if self.mode == 'train':

if task == 'cls':

(self.feed('ReLU3')

.conv(1, 1, 2, 1, 1, task=task, relu=False,

name='pnet/conv4-1', wd=self.weight_decay_coeff))

elif task == 'bbx':

(self.feed('ReLU3')

.conv(1, 1, 4, 1, 1, task=task, relu=False,

name='pnet/conv4-2', wd=self.weight_decay_coeff))

elif task == 'pts':

(self.feed('ReLU3')

.conv(1, 1, 10, 1, 1, task=task, relu=False,

name='pnet/conv4-3', wd=self.weight_decay_coeff))

self.out_put.append(self.get_output())

else:

(self.feed('ReLU3')

.conv(1, 1, 2, 1, 1, relu=False, name='pnet/conv4-1')

.softmax(name='softmax'))

self.out_put.append(self.get_output())

(self.feed('ReLU3')

.conv(1, 1, 4, 1, 1, relu=False, name='pnet/conv4-2'))

self.out_put.append(self.get_output())

1.2 实验结果

初步结果:

后续检验过的结果:mAP  57.85%

1.3 重新训练与测试

Pnet

把其中的prelu改为relu,然后训练。

all trainable variables:

all local variable:

input/input_producer/limit_epochs/epochs:0

input_1/input_producer/limit_epochs/epochs:0

只有卷积核与bias需要训练,没有了prelu的斜率。

Rnet

all trainable variables:

all local variable:

input/input_producer/limit_epochs/epochs:0

Onet

all trainable variables:

all local variable:

input/input_producer/limit_epochs/epochs:0

二、采用网络结构表

Pnet

Feature size

name

Kernel size

Stride

Padding

12*12*3

conv1

ReLU1

3*3*10

1

Valid

10*10*10

pool1_conv1

pool1_ReLU1

3*3*16

2

Same

5*5*16

conv2

ReLU2

3*3*32

1

Valid

3*3*32

conv3

ReLU3

3*3*32

1

Valid

1*1*32

Rnet

Feature size

name

Kernel size

Stride

Padding

24*24*3

conv1

relu1

3*3*28

1

Same

24*24*28

pool1_conv1

pool1_relu1

3*3*28

2

Same

12*12*28

conv2

relu2

3*3*48

1

Same

12*12*48

pool2_conv3

poo2_relu3

3*3*48

2

Same

6*6*48

conv3

relu3

3*3*64

2

Same

3*3*64

Onet

Feature size

name

Kernel size

Stride

Padding

48*48*3

conv1

relu1

3*3*32

1

Same

48*48*32

conv2

relu2

3*3*32

2

Same

24*24*32

conv3

relu3

3*3*64

1

Same

24*24*64

conv4_

relu4_

3*3*64

2

Same

12*12*64

conv5_

relu5_

3*3*128

2

Same

6*6*128

conv6_

relu6_

3*3*128

2

Same

3*3*128

三、c代码端结构的更改

3.1 函数的定义

在network.cpp之中

void relu(struct pBox *pbox, mydataFmt *pbias){

if (pbox->pdata == NULL){

cout << "the Relu feature is NULL!!" << endl;

return;

}

if (pbias == NULL){

cout << "the Relu bias is NULL!!" << endl;

return;

}

mydataFmt *op = pbox->pdata;

mydataFmt *pb = pbias;

long dis = pbox->width*pbox->height;

for(int channel =0;channelchannel; channel++){

for(int col=0; colpdata == NULL){

cout << "the Relu feature is NULL!!" << endl;

return;

}

if (pbias == NULL){

cout << "the Relu bias is NULL!!" << endl;

return;

}

mydataFmt *op = pbox->pdata;

mydataFmt *pb = pbias;

mydataFmt *pg = prelu_gmma;

long dis = pbox->width*pbox->height;

for(int channel =0;channelchannel; channel++){

for(int col=0; col0)?(*op):((*op)*(*pg));

op++;

}

pb++;

pg++;

}

}

3.2 网络的更改

因为relu直接将值进行了替换,所以不存在开辟内存空间的问题,只有运算,并且维度一样,可以直接将prelu函数换位relu函数。

python不支持prelu_MTCNN(九)更改python与c代码的PReLU为ReLU相关推荐

  1. Python 初学者进阶的九大技能(附代码)

    授权自AI科技大本营(ID:rgznai100) 本文约4300字,建议阅读9分钟 本文为你介绍Python必须掌握的九大技能. 以下为译文: Python是一种很棒的语言,语法简单,无需在代码中搜索 ...

  2. python不支持切片的数据类型,python必须知道的六种数据类型

    哈喽,大家好呀 今天让我们来学习学习python3中六大必不可少的标准数据类型 1.数字类型 数字类型(Number)简单理解的就是数值,在python语句中我们不缺乏要写数字和数值,给一个变量或者多 ...

  3. sqap不支持python3吗_Supporting Python 3(支持python3)——欢迎来到Python 3

    标签: 欢迎来到Python 3 On Christmas Day 1999 I sat down to write my first piece of software in Python. My ...

  4. python完全支持面向对象编程_[Python] 类与面向对象编程

    1. class语句 类通常是由函数.变量和属性组成的集合.使用class语句可以定义类,例如: class Account(object): num_accounts = 0 def __init_ ...

  5. python不支持prelu_python实现并绘制 sigmoid函数,tanh函数,ReLU函数,PReLU函数

    python实现并绘制 sigmoid函数,tanh函数,ReLU函数,PReLU函数 # -*- coding:utf-8 -*- from matplotlib import pyplot as ...

  6. python接口自动化(九)--python中字典和json的区别(详解)

    简介 这篇文章的由来是由于上一篇发送post请求的接口时候,参数传字典(dict)和json的缘故,因为python中,json和dict非常类似,都是key-value的形式,为啥还要这么传参,在群 ...

  7. python中双向索引_Python 字典支持双向索引。Python 集合也支持双向索引

    Python 字典支持双向索引.Python 集合也支持双向索引 答:错 推的策略适用于用户多而广,需求总量大的产品促销 答:× 中国保险条款中属于一般附加险别的有( ) 答:短量险 钩损险 Next ...

  8. python 基础系列(二) — Python基本语法

    python 基础系列(二) - Python基本语法 python基础系列索引 python 基础系列(一) - Python介绍 python 基础系列(二) - Python基本语法 pytho ...

  9. Python是否支持短路?

    本文翻译自:Does Python support short-circuiting? Python是否支持布尔表达式短路? #1楼 参考:https://stackoom.com/question/ ...

最新文章

  1. Error: Could not access the Package Manager. Is the system running?
  2. Linux入门(6)——Ubuntu16.04安装atom
  3. 【开源框架】:解决方案级别的代码生成器 WebFirst
  4. android_secure写权限,如何在android中设置权限WRITE_SECURE_SETTINGS?
  5. 从主机 Windows 上无法远程访问 Linux 的 Tomcat 服务器解决方法
  6. 博弈论 从懵逼到入门 详解
  7. VScode 搭建 django 开发环境(MAC、Python3.7)
  8. UNIX环境高级编程-#include “apue.h“
  9. Mysql数据库创建表——标准模板
  10. qomo linux最新版本,Qomo Linux下一个版本将推驱动中心
  11. 苹果官网iPad mini滚动动画实现原理探究
  12. php怎么给图片添加文字,使用php怎么给图片添加文字水印
  13. GDSOI2019退役祭
  14. Flutter:表单Form
  15. 我找到了村里最挣钱的生意!
  16. python实现base64解码_Python实现base64编码解码
  17. 【已解决】error: ‘CV_GRAY2BGR’ was not declared in this scope
  18. android 音乐文件删除,如何从华为手机恢复已删除的音频或音乐文件
  19. 一份合格的软件需求规格说明书的要求
  20. 2015 电子科大校园招聘名单(更新中)

热门文章

  1. html生成pdf表格线加粗,iText 用 HTMLWorker 转换 HTML 为 PDF 时可设置表格列宽度
  2. 数字签名加密过程举例
  3. 【Python3爬虫】破解时光网登录加密参数并实现模拟登录
  4. 加强版!利用python自动发送邮件
  5. 配置window下python3环境
  6. 网页静态服务器-3-使用类
  7. 由dataview生成对应的datatable的方法
  8. 【转】freetextbox的ToolBarLayout属性设置
  9. [论文阅读][SLAM]Targetless Calibration of LiDAR-IMU System Based on Continuous-time Batch Estimation
  10. 吴恩达深度学习 —— 3.2 神经网络表示