用C实现神经网络之KANN库简介

下载链接:https://github.com/attractivechaos/kann

以什么是KANN:

       KANN是一个独立的轻量级库,用于构建和训练中小型人工神经网络,如多层感知器卷积神经网络递归神经网络(包括LSTMGRU)。它实现了基于图形的反向模式自动区分,并允许构建具有递归,共享权重和多个输入/输出/成本的拓扑复杂神经网络。与主流深度学习框架(如TensorFlow)相比,KANN不具备可扩展性,但它的灵活性接近,代码库小得多,仅依赖于标准C库。与其他轻量级框架(如tiny-dnn)相比,KANN仍然更小,更快,更通用,支持RNN,VAE和非标准神经网络,可能会使这些轻量级框架失效。

特征

    灵活。通过使用运算符构建计算图来进行模型构建。支持RNN,权重共享和多个输入/输出。

    高效。合理优化的矩阵产品和卷积。支持迷你批处理和有效的多线程。有时在主CPU模式下比主流框架更快。

    小巧便携。截至目前,KANN在四个源代码文件中的代码少于4000行,默认情况下没有非标准依赖项。与ANSI C编译器兼容。

限制

    仅限CPU。因此,KANN 不是用于训练巨大的神经网络。

    缺少一些常见的运算符和体系结构,如批量标准化。

    缺少用于训练RNN的详细API

API

神经网络中的网络层:

    kad_node_t *kad_feed(int n_d, ...):设置输入层节点,如:t = kad_feed(4, 1, 1, 28, 28);

    kad_node_t *kann_layer_dense(kad_node_t *in, int n1)

    kad_node_t *kann_layer_conv2d(kad_node_t *in, int n_flt, int k_rows, int k_cols, int stride_r, int stride_c, int pad_r, int pad_c):

   kad_node_t *kann_layer_gru(kad_node_t *in, int n1, int rnn_flag)

    kad_node_t *kann_layer_rnn(kad_node_t *in, int n1, int rnn_flag)

    kad_node_t *kann_layer_layernorm(kad_node_t *in)      //Batch Normalization

    kad_node_t *kann_layer_dropout(kad_node_t *t, float r)

    kad_node_t *kad_max2d(kad_node_t *x, int kernel_r, int kernel_c, int stride_r, int stride_c, int top_pad, int left_pad)

激活函数:

    kad_node_t *kad_square(kad_node_t *x);     /* f(x) = x^2 (element-wise square) */

    kad_node_t *kad_sigm(kad_node_t *x);      /* f(x) = 1/(1+exp(-x))              (element-wise sigmoid) */

    kad_node_t *kad_tanh(kad_node_t *x);      /* f(x) = (1-exp(-2x)) / (1+exp(-2x)) (element-wise tanh) */

    kad_node_t *kad_relu(kad_node_t *x);       /* f(x) = max{0,x}                    (element-wise rectifier, aka ReLU) */

    kad_node_t *kad_softmax(kad_node_t *x);    /* f_i(x_1,...,x_n) = exp(x_i) / \sum_j exp(x_j) (softmax: tf.nn.softmax(x,dim=-1)) */

    kad_node_t *kad_1minus(kad_node_t *x);     /* f(x) = 1 - x */

    kad_node_t *kad_exp(kad_node_t *x);        /* f(x) = exp(x) */

    kad_node_t *kad_log(kad_node_t *x);        /* f(x) = log(x) */

    kad_node_t *kad_sin(kad_node_t *x);       /* f(x) = sin(x) */

构建网络:

    kann_t *kann_new(kad_node_t *cost, int n_rest, ...)

训练网络:

    int kann_train_fnn1(kann_t *ann, float lr, int mini_size, int max_epoch, int max_drop_streak, float frac_val, int n, float **_x, float **_y)

        对于RNN多输入的网络, kann_train_fnn1并不适合,而且kann中也没有提供类似API

模型保存及加载:

    kann_t *kann_load_fp(FILE *fp)

    void kann_save(const char *fn, kann_t *ann)

线程加速:

    void kann_mt(kann_t *ann, int n_threads, int max_batch_size)

内存释放:

    void kann_data_free(kann_data_t *d)

    void kann_delete(kann_t *a)

数据结构

输入数据结构为【1,1,28,28】

The shape of n-d arrays

    For 2D convolution, cuDNN and Theano take images in shape of (batch-size,in-channel,height,width) and convolution weights in shape of (out-channel,in-channel,kernel-height,kernel-width). KANN follows the cuDNN and Theano convention. Caffe and TensorFlow are different. They take images in shape of (batch-size,height,weight,in-channel) and weights in (kernel-height,kernel-width,in-channel,out-channel).

存储到链表中为:

typedef struct kad_node_t {  
    uint8_t n_d;                                          /* number of dimensions; no larger than KAD_MAX_DIM */ //尺寸数;不大于KADY-Max  
    uint8_t flag;                                                      /* type of the node; see KAD_F_* for valid flags */ //节点的类型  
    uint16_t op;                                                      /* operator; kad_op_list[op] is the actual function */  
    int32_t n_child;                                                  /* number of operands/child nodes */  
    int32_t tmp;                                                      /* temporary field; MUST BE zero before calling kad_compile() */  
    int32_t ptr_size;                                                  /* size of ptr below */  
    int32_t d[KAD_MAX_DIM];                                 /* dimensions */  
    int32_t ext_label;                                              /* labels for external uses (not modified by the kad_* APIs) */  
    uint32_t ext_flag;                                              /* flags for external uses (not modified by the kad_* APIs) */  
    float *x;                                                              /* value; allocated for internal nodes */  
    float *g;                                                             /* gradient; allocated for internal nodes */  
    void *ptr;                                                          /* for special operators that need additional parameters (e.g. conv2d) */  
    void *gtmp;                                                    /* temporary data generated at the forward pass but used at the backward pass */  
    struct kad_node_t **child;                              /* operands/child nodes */  
    struct kad_node_t *pre;                                  /* usually NULL; only used for RNN */
} kad_node_t, *kad_node_p; 

图示结构图:

    

测试性能

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容