网络结构:
PRelu比Relu稍好一些。
bottlenecks更小
在网络开始部分采用快速下采样
最后几个卷积层采用早期降维
训练中采用批量正则化
sample/svp/sample_svp_nnie:
#ifdef __cplusplus
如果当前的宏已被定义过,则对“x以下”进行编译
#if __cplusplus
extern "C"{
关键字extern对该变量作外部变量声明,外部变量就是全局变量。
#endif
#endif /* __cplusplus */
#define SAMPLE_SVP_NNIE_ARG_MAX_NUM 2
#define SAMPLE_SVP_NNIE_CMP_STR_NUM 2
static char **g_cmd_argv = HI_NULL;
static就是静态的意思,char是字符数据类型。静态局部变量
/* function : to process abnormal case */
功能,处理异常情况
#ifndef __HuaweiLite__
用于注释掉一段代码,或者防止头文件重复包含
static void sample_svp_nnie_handle_sig(int signo)
void的含义
void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型,亦即可用任意数据类型的指针对void指针赋值。
void的作用
①对函数返回的限定。
②对函数参数的限定。
当函数不需要返回值时,必须使用void限定。例如: void func(int, int);
当函数不允许接受参数时,必须使用void限定。例如: int func(void)。
{
if (signo == SIGINT || signo == SIGTERM) {
signal函数:软中断,该函数设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作
C语言标准定义了6个信号,都定义在signal.h头文件中:
(1). SIGABRT:程序异常中止,如调用abort函数。
(2). SIGFPE:算术运算出错,如除数为0或溢出。
(3). SIGILL:非法函数映像,如非法指令。
(4). SIGINT:当用户按中断键(一般是Ctrl+C或Delete键)时,驱动程序会产生此信号来终止进程。
(5). SIGSEGV:无效内存访问,段错误。
(6). SIGTERM:程序的中止请求。该信号可被应用程序捕获,从而进行清理工作,完成优雅的终止
switch (*g_cmd_argv[1]) {
其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
case '0':
sample_svp_nnie_cnn_handle_sig();
break;
C语言还提供了一种break语句,专用于跳出switch语句
case '1':
sample_svp_nnie_segnet_handle_sig();
break;
case '2':
case '3':
case '4':
case 'b':
case 'c':
sample_svp_nnie_faster_rcnn_handle_sig();
break;
case '5':
case 'd':
sample_svp_nnie_rfcn_handle_sig();
break;
case '6':
case 'e':
sample_svp_nnie_ssd_handle_sig();
break;
case '7':
case 'f':
sample_svp_nnie_yolov1_handle_sig();
break;
case '8':
case 'g':
sample_svp_nnie_yolov2_handle_sig();
break;
case '9':
case 'h':
sample_svp_nnie_yolov3_handle_sig();
break;
case 'a':
sample_svp_nnie_lstm_handle_sig();
break;
case 'i':
sample_svp_nnie_rfcn_vi_vo_handle_sig();
break;
default :
break;
}
printf("\033[0;31mprogram termination abnormally!\033[0;39m\n");
}
exit(-1);
退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1,
}
#endif
/* function : show usage */
功能:显示用法
static void sample_svp_nnie_usage(const char* prg_name)
const char *p; //*p是const,p可变:const 后面紧跟的是char,所以*p是一个char字符,不可变
const (char *) p;//p是const,*p可变:const 后面紧跟的是(char *)这个整体,所以p是char*类型,不可变。
char* const p; //p是const,*p可变:const 后面紧跟的是p,所以p不可变
const char* const p; //p和*p都是const:第一个const后面紧跟的是char,所以char类型的字符*p不可变;第二个const后面紧跟的是p,所以p不可变。
char const * p;// *p是const,p可变:const后面紧跟的是*,但是单独的*不能表明修饰的内容,所以将*p看成一个整体,所以const修饰的是*p,*p不可变。
(char*) const p;//p是const,*p可变:const紧跟的是p,所以p不可变。
char* const p;// p是const,*p可变:const紧跟的是p,所以p不可变。
char const* const p;// p和*p都是const:第一个const紧跟的是*,不能表明修饰的内容,将后面整体的(* const p)看成一个整体,那就说明*p不可变,第二个const后面紧跟的是p,所以p不可变。
{
printf("Usage : %s <index> \n", prg_name);
printf("index:\n");
printf("\t 0) cnn(Read File).\n");
printf("\t 1) segnet(Read File).\n");
printf("\t 2) faster_rcnn_alexnet_rpn_sw(Read File).\n");
printf("\t 3) faster_rcnn_pvanet_rpn_sw(Read File).\n");
printf("\t 4) faster_rcnn_double_roi_pool_rpn_sw(Read File).\n");
printf("\t 5) rfcn_rpn_sw(Read File).\n");
printf("\t 6) ssd_detect_out_sw(Read File).\n");
printf("\t 7) yolov1_detect_out_sw(Read File).\n");
printf("\t 8) yolov2_detect_out_sw(Read File).\n");
printf("\t 9) yolov3_detect_out_sw(Read File).\n");
printf("\t a) lstm(Read File).\n");
printf("\t b) faster_rcnn_alexnet_rpn_hw(Read File).\n");
printf("\t c) faster_rcnn_double_roi_pool_rpn_hw(Read File).\n");
printf("\t d) rfcn_rpn_hw(Read File).\n");
printf("\t e) ssd_detect_out_hw(Read File).\n");
printf("\t f) yolov1_detect_out_hw(Read File).\n");
printf("\t g) yolov2_detect_out_hw(Read File).\n");
printf("\t h) yolov3_detect_out_hw(Read File).\n");
printf("\t i) rfcn_vi_vo(vi_vo).\n");
}