很久没有写博客了,忙并不是借口,懒才是理由。
一直想重构CupCnn,写成一个通用的计算图,能随意搭建各种神经网络(CupCnn只能搭建有一个链路的有序的神经网络),然后把名字也改了,叫CupDnn好了。所以,今天先写着试下遍历一个计算图吧。
先随便构造一个简单的计算图,如下:
关于这个图的说明:
假设每一个Unit都执行一些计算,把计算结果推送给与他相连接的Unit,下一个Unit对输入再做计算。也就是说,如果有一个Unit,有三个输入,那么为了完成计算,它必须等待三个输入都将结果输出给它,它才可以执行它的计算。比如说,fifth需要second,third,forth三个图元的输出结果,它必须等这三个图源都完成计算,并将结果递送给它,它才可以进行计算。这里的计算就是打印图元的名字。
遍历分为深度优先和广度优先,深度优先用递归实现,广度优先用任务队列实现。
代码如下:
//define graph unit
typedef struct graph_unit{
string name;
bool visit;
int inputSize;
int outputSize;
vector<struct graph_unit *> *outputs;
vector<struct graph_unit *> *inputs;
}Unit,*PUnit;
PUnit createGraph()
{
PUnit input = new Unit;
input->name = "intput";
input->inputSize = 0;
input->outputSize = 3;
input->visit = false;
input->inputs = nullptr;
input->outputs = new vector<PUnit>;
PUnit first = new Unit;
first->name = "first";
first->inputSize = 1;
first->outputSize = 1;
first->visit = false;
first->inputs = new vector<PUnit>;
first->outputs = new vector<PUnit>;
PUnit second = new Unit;
second->name = "second";
second->inputSize = 1;
second->outputSize = 1;
second->visit = false;
second->inputs = new vector<PUnit>;
second->outputs = new vector<PUnit>;
PUnit third = new Unit;
third->name = "third";
third->inputSize = 1;
third->o