深度学习(七十)darknet 实现编写mobilenet源码
一、添加一个新的网络层
(1)parse.c文件中函数string_to_layer_type,添加网络层类型解析:
if (strcmp(type, "[depthwise_convolutional]") == 0) return DEPTHWISE_CONVOLUTIONAL;
(2)darknet.h文件中枚举类型LAYER_TYPE,添加网络层枚举类型:
DEPTHWISE_CONVOLUTIONAL;
(3)parse.c文件中函数parse_network_cfg添加网络层解析后进行构建:
LAYER_TYPE lt = string_to_layer_type(s->type);
if (lt == DEPTHWISE_CONVOLUTIONAL) {
l = parse_depthwise_convolutional(options, params);//自己编写的函数,主要调用了make layer
}
else if(lt == CONVOLUTIONAL){
l = parse_convolutional(options, params);
(4)parse.c 添加参数读取网络层加载文件
A、添加网络层读取参数函数
void load_weights_upto(network *net, char *filename, int start, int cutoff) load depthwise weights;
B、把参数读取到内存上:
void load_depthwise_convolutional_weights(layer l, FILE *fp);
C、以及修改depthwise_convolutional_kenel.cu把读取后的cpu参数拷贝到显存上:
void push_depthwise_convolutional_layer(depthwise_convolutional_layer layer);
(5)parse.c添加参数保存功能:
void save_weights_upto(network net, char *filename, int cutoff): void save_depthwise_convolutional_weights(layer l, FILE *fp); void pull_depthwise_convolutional_layer(depthwise_convolutional_layer layer);
(6)添加network.c中网络层:
int resize_network(network *net, int w, int h)的resize:
if (l.type==DEPTHWISE_CONVOLUTIONAL)
{
resize_depthwise_convolutional_layer(&l, w, h);
}
(7)另外在多卡异步训练的时候,network_kernels.cu的好几个函数也要添加depth_convolutional参数相关的更新设置。
总结为一句话:直接搜索项目中调用:CONVOLUTIONAL的关键子
有调用到卷积层枚举类型的地方,可分离卷积层也要添加相对应的功能。
(8)darknet使用须知:darknet的网络配置文件中的学习率、batch并不是我们平时所说的学习率、batch_size。网络更新所用的学习率为:learning_rate/batch_size,所以学习率不能太小,比如如果学习率设置为0.01,batch=128,那么实际计算的学习率就是0.000078,非常小的一个数值,基本上就是更新不了
二、编写网络层代码:depthwise_convolutional_kernels.cu、depthwise_convolutional_layer.c、depthwise_convolutional_layer.h
三、编写mobilenet网络结构文件:
[net] batch=32 subdivisions=1 height=224 width=224 channels=3 momentum=0.9 decay=0.000 max_crop=320 learning_rate=0.1 policy=poly power=3 max_batches=1600000 #conv1 [convolutional] batch_normalize=1 filters=32 size=3 stride=2 pad=1 activation=relu #conv2_1/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=1 pad=1 activation=relu #conv2_1/sep [convolutional] batch_normalize=1 filters=64 size=1 stride=1 pad=0 activation=relu #conv2_2/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=2 pad=1 activation=relu #conv2_2/sep [convolutional] batch_normalize=1 filters=128 size=1 stride=1 pad=0 activation=relu #conv3_1/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=1 pad=1 activation=relu #conv3_1/sep [convolutional] batch_normalize=1 filters=128 size=1 stride=1 pad=0 activation=relu #conv3_2/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=2 pad=1 activation=relu #conv3_2/sep [convolutional] batch_normalize=1 filters=256 size=1 stride=1 pad=0 activation=relu #conv4_1/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=1 pad=1 activation=relu #conv4_1/sep [convolutional] batch_normalize=1 filters=256 size=1 stride=1 pad=0 activation=relu #conv4_2/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=2 pad=1 activation=relu #conv4_2/sep [convolutional] batch_normalize=1 filters=512 size=1 stride=1 pad=0 activation=relu #conv5_1/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=1 pad=1 activation=relu #conv5_1/sep [convolutional] batch_normalize=1 filters=512 size=1 stride=1 pad=0 activation=relu #conv5_2/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=1 pad=1 activation=relu #conv5_2/sep [convolutional] batch_normalize=1 filters=512 size=1 stride=1 pad=0 activation=relu #conv5_3/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=1 pad=1 activation=relu #conv5_3/sep [convolutional] batch_normalize=1 filters=512 size=1 stride=1 pad=0 activation=relu #conv5_4/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=1 pad=1 activation=relu #conv5_4/sep [convolutional] batch_normalize=1 filters=512 size=1 stride=1 pad=0 activation=relu #conv5_5/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=1 pad=1 activation=relu #conv5_5/sep [convolutional] batch_normalize=1 filters=512 size=1 stride=1 pad=0 activation=relu #conv5_6/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=2 pad=1 activation=relu #conv5_6/sep [convolutional] batch_normalize=1 filters=1024 size=1 stride=1 pad=0 activation=relu #conv6/dw [depthwise_convolutional] batch_normalize=1 size=3 stride=1 pad=1 activation=relu #conv6/sep [convolutional] batch_normalize=1 filters=1024 size=1 stride=1 pad=0 activation=relu #pool6 [avgpool] #fc7 [convolutional] filters=1000 size=1 stride=1 pad=0 activation=leaky [softmax] groups=1 [cost]
四、imagenet训练实验
1、训练一天后,经过两轮多的epoch后,精度:
2、训练两天后,迭代第二天结果:
3\又训练了一天多:
深度学习(七十)darknet 实现编写mobilenet源码的更多相关文章
- Tensorflow深度学习之十二:基础图像处理之二
Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474 首先放出原始图像: ...
- 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理
1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...
- 并发编程学习笔记(8)----ThreadLocal的使用及源码分析
1. ThreadLocal的理解 ThreadLocal,顾名思义,就是线程的本地变量,ThreadLocal会为每个线程创建一个本地变量副本,使得使用ThreadLocal管理的变量在多线程的环境 ...
- 【转载】深度解读 java 线程池设计思想及源码实现
总览 开篇来一些废话.下图是 java 线程池几个相关类的继承结构: 先简单说说这个继承结构,Executor 位于最顶层,也是最简单的,就一个 execute(Runnable runnable) ...
- Java并发指南12:深度解读 java 线程池设计思想及源码实现
深度解读 java 线程池设计思想及源码实现 转自 https://javadoop.com/2017/09/05/java-thread-pool/hmsr=toutiao.io&utm_ ...
- Java并发包源码学习系列:JDK1.8的ConcurrentHashMap源码解析
目录 为什么要使用ConcurrentHashMap? ConcurrentHashMap的结构特点 Java8之前 Java8之后 基本常量 重要成员变量 构造方法 tableSizeFor put ...
- Deep learning深度学习的十大开源框架
Google开源了TensorFlow(GitHub),此举在深度学习领域影响巨大,因为Google在人工智能领域的研发成绩斐然,有着雄厚的人才储备,而且Google自己的Gmail和搜索引擎都在使用 ...
- JavaScript学习总结(十四)——JavaScript编写类的扩展方法
在JavaScript中可以使用类的prototype属性来扩展类的属性和方法,在实际开发当中,当JavaScript内置的那些类所提供的动态 ...
- 深度学习(十) GoogleNet
GoogLeNet Incepetion V1 这是GoogLeNet的最早版本,出现在2014年的<Going deeper with convolutions>.之所以名为“GoogL ...
随机推荐
- bzoj 3657 斐波那契数列(fib.cpp/pas/c/in/out)
空间 512M 时限2s [题目描述] 有n个大于1的正整数a1,a2,…,an,我们知道斐波那契数列的递推式是f(i)=f(i-1)+f(i-2),现在我们修改这个递推式变为f(i)=f(i-1) ...
- 终极之shell-zsh全解析
什么是Zsh Zsh是一款强大的虚拟终端,既是一个系统的虚拟终端,也可以作为一个脚本语言的交互解析器. Zsh的一些特性 兼容bash,原来使用bash的兄弟切换过来毫无压力. 强大的历史纪录功能,在 ...
- 算数基本定理 - nefu 118
算数基本定理 每个大于1的正整数都可以被唯一分解为素数的成绩,在乘积中的素因子按照非降序排列 a = p1^a1 * p2^a2 * ... pn^an; b = p1^b1 * p2^b2 * .. ...
- C#代码实现 Excel表格与Object互相转换,Excel表格导入数据库(.NET2.0 .NET4.0)
前些天在工作上遇到这个需求,在GitHub找到一个开源代码可以用,Fork了一个版本,整理一下发出来. ①.Net项目中使用Nuget安装一个 NPOI 包 https://github.com ...
- 设计模式——迭代器(Iterator)模式
概述 迭代器模式简单的说(按我目前的理解)就是一个类提供一个对外迭代的接口,方面调用者迭代.这个迭代接口至少包括两个方法:hasNext()--用于判断是否还有下一个,next()--用于取出下一个对 ...
- CGI-FASTCGI-PHPFPM
随意记录,摘自知乎 原文链接:https://segmentfault.com/q/1010000000256516 首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式 ...
- 正确使用iOS常量(const)、enum以及宏(#define)
前言:本文主要梳理iOS中如何使用常量.enum.宏,以及各自的使用场景. 重要的事情首先说:在iOS开发中请尽量多使用const.enum来代替宏定义(#define):随着项目工程的逐渐增大,过多 ...
- 【转】TCP那些事(上,下)
TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获.关于TCP这个协议的细节,我还是推荐你去 ...
- Selenium元素定位问题
定位元素时,遇到一些诡异事件: 明明就是通过ID定位的,但是就是没有定位到该元素呢? 1.通过element.find_elements_by_xxx()获取该元素的个数,试试是否有获取到元素,0个表 ...
- SpringBoot下的值注入
在我们实际开发项目中,经常会遇到一些常量的配置,比如url,暂时不会改变的字段参数,这个时候我们最好是不要直接写死在代码里的,因为这样编写的程序,应用扩展性太差了,我们可以直接写在配置文件中然后通过配 ...