[Darknet源码]3.主要数据结构

正午 2020-07-06 AM 180℃ 0条

这里的数据结构指的主要是各种 struct, 我把它们分为两种,一种是辅助性结构体, 比如listimage
另一种是和模型相关的结构体比如 netlayer. 大部分通用的结构都在 darknet.h 中定义。

Darknet里 没有 Tensor 的概念,但对神经网络还是分为 netlayer两个

net 的部分定义如下,主要的组成是指针 layer *layer, 还会存储一些网络训练需要的全局参数,比如优化相关的参数。


typedef struct network{
    int n;
    int batch;
    size_t *seen;
    int *t;
    float epoch;
    int subdivisions;
    layer *layers;
    float *output;
    learning_rate_policy policy;

net 相关方法主要下面几个,前向,后向,以及参数更新

void forward_network(network *net);
void backward_network(network *net);
void update_network(network *net);

layer 的定义就很长了,主要是不同类型的layer 都公用这一个结构体,导致整个结构体非常长,多达几百行。
同样的layer 包含三个函数指针,对于不同的 layer 实现这三个指针函数就是主要的工作

void forward_network(network *net);
void backward_network(network *net);
void update_network(network *net);

所有的权重和梯度都是通过 float * 来传递的。

除了这两个主要的结构体,还有几个可以了解下,实现都相对简单,list, image, data也有定义一个 matrix 但是并不是主要用的结构。重点可以关注下data, wh 对应输入图像的宽和高,X是一个 matrix , batch 行, 列的数量就是图像的像素数,比如 28 X 28 X 1 的图像会按行优先存储,一看

typedef struct{
    int w, h;
    matrix X;
    matrix y;
    int shallow;
    int *num_boxes;
    box **boxes;
} data;

看这些结构体的定义就知道是为图像任务定制的,所以 Darknet 某种程度上都不能算一个深度学习框架,比如我尝试用 Darknet 去写 word2vec 就发现我相当于要把 word2vec从头写一遍。 当然了 Tensorflow 和 Pytorch 不需要从头写也是因为有人帮我们提前定制好了,比如 embedding 层。

标签: none

非特殊说明,本博所有文章均为博主原创。

评论