python不支持prelu_MTCNN(九)更改python与c代码的PReLU为ReLU
背景: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相关推荐
- Python 初学者进阶的九大技能(附代码)
授权自AI科技大本营(ID:rgznai100) 本文约4300字,建议阅读9分钟 本文为你介绍Python必须掌握的九大技能. 以下为译文: Python是一种很棒的语言,语法简单,无需在代码中搜索 ...
- python不支持切片的数据类型,python必须知道的六种数据类型
哈喽,大家好呀 今天让我们来学习学习python3中六大必不可少的标准数据类型 1.数字类型 数字类型(Number)简单理解的就是数值,在python语句中我们不缺乏要写数字和数值,给一个变量或者多 ...
- 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 ...
- python完全支持面向对象编程_[Python] 类与面向对象编程
1. class语句 类通常是由函数.变量和属性组成的集合.使用class语句可以定义类,例如: class Account(object): num_accounts = 0 def __init_ ...
- python不支持prelu_python实现并绘制 sigmoid函数,tanh函数,ReLU函数,PReLU函数
python实现并绘制 sigmoid函数,tanh函数,ReLU函数,PReLU函数 # -*- coding:utf-8 -*- from matplotlib import pyplot as ...
- python接口自动化(九)--python中字典和json的区别(详解)
简介 这篇文章的由来是由于上一篇发送post请求的接口时候,参数传字典(dict)和json的缘故,因为python中,json和dict非常类似,都是key-value的形式,为啥还要这么传参,在群 ...
- python中双向索引_Python 字典支持双向索引。Python 集合也支持双向索引
Python 字典支持双向索引.Python 集合也支持双向索引 答:错 推的策略适用于用户多而广,需求总量大的产品促销 答:× 中国保险条款中属于一般附加险别的有( ) 答:短量险 钩损险 Next ...
- python 基础系列(二) — Python基本语法
python 基础系列(二) - Python基本语法 python基础系列索引 python 基础系列(一) - Python介绍 python 基础系列(二) - Python基本语法 pytho ...
- Python是否支持短路?
本文翻译自:Does Python support short-circuiting? Python是否支持布尔表达式短路? #1楼 参考:https://stackoom.com/question/ ...
最新文章
- Error: Could not access the Package Manager. Is the system running?
- Linux入门(6)——Ubuntu16.04安装atom
- 【开源框架】:解决方案级别的代码生成器 WebFirst
- android_secure写权限,如何在android中设置权限WRITE_SECURE_SETTINGS?
- 从主机 Windows 上无法远程访问 Linux 的 Tomcat 服务器解决方法
- 博弈论 从懵逼到入门 详解
- VScode 搭建 django 开发环境(MAC、Python3.7)
- UNIX环境高级编程-#include “apue.h“
- Mysql数据库创建表——标准模板
- qomo linux最新版本,Qomo Linux下一个版本将推驱动中心
- 苹果官网iPad mini滚动动画实现原理探究
- php怎么给图片添加文字,使用php怎么给图片添加文字水印
- GDSOI2019退役祭
- Flutter:表单Form
- 我找到了村里最挣钱的生意!
- python实现base64解码_Python实现base64编码解码
- 【已解决】error: ‘CV_GRAY2BGR’ was not declared in this scope
- android 音乐文件删除,如何从华为手机恢复已删除的音频或音乐文件
- 一份合格的软件需求规格说明书的要求
- 2015 电子科大校园招聘名单(更新中)
热门文章
- html生成pdf表格线加粗,iText 用 HTMLWorker 转换 HTML 为 PDF 时可设置表格列宽度
- 数字签名加密过程举例
- 【Python3爬虫】破解时光网登录加密参数并实现模拟登录
- 加强版!利用python自动发送邮件
- 配置window下python3环境
- 网页静态服务器-3-使用类
- 由dataview生成对应的datatable的方法
- 【转】freetextbox的ToolBarLayout属性设置
- [论文阅读][SLAM]Targetless Calibration of LiDAR-IMU System Based on Continuous-time Batch Estimation
- 吴恩达深度学习 —— 3.2 神经网络表示