Caffe
https://www.leiphone.com/news/201702/T5e31Y2ZpeG1ZtaN.html
1. Caffe 的核心概念是 Layer,每一个神经网络的模块都是一个 Layer
2. Layer 接收输入数据,同时经过内部计算产生输出数据
3. 设计网络结构时,只需要把各个 Layer 拼接在一起构成完整的网络(通过写 protobuf 配置文件定义)。比如卷积的 Layer,它的输入就是图片的全部像素点,内部进行的操作是各种像素值与 Layer 参数的 convolution 操作,最后输出的是所有卷积核 filter 的结果。每一个 Layer 需要定义两种运算,一种是正向(forward)的运算,即从输入数据计算输出结果,也就是模型的预测过程;另一种是反向(backward)的运算,从输出端的 gradient 求解相对于输入的 gradient,即反向传播算法,这部分也就是模型的训练过程。实现新 Layer 时,需要将正向和反向两种计算过程的函数都实现,这部分计算需要用户自己写 C++或者 CUDA (当需要运行在 GPU 时)代码,对普通用户来说还是非常难上手的。正如它的名字 Convolutional Architecture for Fast Feature Embedding 所描述的,Caffe 最开始设计时的目标只针对于图像,没有考虑文本、语音或者时间序列的数据,因此 Caffe 对卷积神经网络的支持非常好,但对时间序列 RNN、LSTM 等支持得不是特别充分。同时,基于 Layer 的模式也对 RNN 不是非常友好,定义 RNN 结构时比较麻烦。在模型结构非常复杂时,可能需要写非常冗长的配置文件才能设计好网络,而且阅读时也比较费力。