一切不结合实践的理论文章都是耍流氓!!!
所以这里学习MKL-DNN的最终目的是把mkldnn放到一个实际的超分辨率推理应用中去做加速。这里我选中了下面这篇文章的DRRN模型推理加速来做我这次学习的最终目的
DRRN的网络架构如下(图片来自DRRN的论文, 地址 http://cvlab.cse.msu.edu/pdfs/Tai_Yang_Liu_CVPR2017.pdf)
纯C++超分辨率重建DRRN --改编中用了U=9的一个网络,即中间一绿一红conv模块组成一个残差块,在这里一共用了9个。每个残差块里包含2个conv模块,每个conv模块里又包含了一个BatchNormal, 一个Relu还有一个convolution层。
这个模型的特点是
1. 首先把输入的LR图像先基于bicubic算法做一个放大,接下来把放大后的图像再放到网络模型里一层层做计算。因此对内存的需求比fsrcnn之类的直接对LR图像作为输入的模型要大得多。
2. 相对网络层数特别的多,一共做了20组BN->ReLU->Conv的计算,计算量特别的大。《纯C++超分辨率重建DRRN --改编》原文中的C++程序,最大输入图片在我的电脑上只能做到40*30的分辨率。如果要做320*240的分辨率超分到960*720,在我的电脑上至少要4个小时以上。
3. 计算网络层的种类较少,这个模型总共用到了3种网络层,BN/ReLU/Conv, 都是CNN里常用的典型网络层。所以我们要在mkl-dnn里分别实验这3种网络层计算,最终把它们集成进《纯C++超分辨率重建DRRN --改编》里面的纯C++代码里做一个加速,并且做一个速度的比较。
最后再推广一个查看深度网络模型架构的应用Netron, 真是神器。下图是netron导出来的我要用的caffe格式DRRN模型的网络拓扑图
下篇文章开始开始一个一个的实现Relu/BN/Conv!!!