Keras底层使用Theano或TensorFlow,这两个库也称为Keras的后端。无论是Theano还是TensorFlow,都是一个“符号式”的库。
这使得Keras的编程与传统的Python代码有所差别,简单而言(符号主义的计算):
首先需定义各种变量;
然后建立一个“计算图”,计算图规定了各个变量之间的计算关系;
再次建立好计算图需要编译以确定其内部细节,然而,此时的计算图还是一个“空壳子”,里面没有任何实际的数据;
最后当把需要的输入放进去后,才能在整个模型中形成数据流,从而形成输出值。
就像用管道搭建供水系统,当你在拼水管的时候,里面是没有水的,只有所有的管子都接完了,才能送水。Keras的模型搭建形式就是这种方法,在你搭建Keras模型完毕后,你的模型就是一个空壳子,只有实际生成可调用的函数后,输入数据,才能形成真正的数据流。
张量 tensor
张量可看着向量、矩阵的自然推广,其在Keras中表示广泛的数据类型。
规模最小的张量是0阶张量,即标量,也就是一个数。
当我们把一些数有序的排列起来,就形成了一阶张量,也就是一个向量。
若把一组向量有序排列起来,就形成了二阶张量,也就是一个矩阵。
把矩阵摞起来,就是三阶张量,我们可称为一个立方体,具有三种颜色通道的彩色图片就是一个这样的立方体。
张量的阶数也称为维度、轴(axis)。
如矩阵[[1,2],[3,4]],是一个二阶张量,有两个维度或轴。
沿着第0个轴看到的是[1,2],[3,4]两个向量,沿着第1个轴看到的是[1,3],[2,4]两个向量。
数据格式 data_format
这是一个关于彩色图片如何表示的问题上,Theano和TensorFlow发生了分歧。
Theano模式把100张RGB三通道的16*32(高为16宽为32),彩色图表示为下面这种形式(100,3,16,32),Caffe采取的也是这种形式。第0个维度是样本维,代表样本的数目,第1个维度是通道维,代表颜色通道数,后面两个就是高和宽。这种数据组织方法,称为"channels_first",即通道维靠前。
TensorFlow的表达形式是(100,16,32,3),即把通道维放在了最后,这种数据组织方式称为"channels_last"。
函数式模型
在Keras 0.x中,模型有两种:
一种叫Sequential,称为序贯模型,也就是单输入单输出,一条路通到底,层与层之间只有相邻关系,无跨层连接。
这种模型编译速度快,操作上也比较简单。
另一种模型称为Graph,即图模型,这个模型支持多输入多输出,层与层之间想怎么连均可,但编译速度慢。
其实,Sequential是Graph的一种特殊情况。
在Keras1和Keras2中,图模型被移除了,而增加了"functional model API"。由于"functional model API"在使用时利用的是”函数式编程“的风格,故将其称为函数式模型。
batch
深度学习的优化算法,即梯度下降,每次的参数更新有两种方式:
第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。
这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这称为Batch gradient descent,批梯度下降。
第二种,每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent。
这个方法速度比较快,但收敛性能不太好,可能在最优点附近摆动,却达不到最优点。两次参数的更新也有可能互相抵消,造成目标函数震荡的比较剧烈。
为了克服两种方法的缺点,采用了一种折中的手段,mini-batch gradient decent,小批的梯度下降,即把数据分为若干批,按批更新参数。这样,一批中的一组数据共同决定本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因批的样本数与整个数据集相比小了很多,计算量也不是很大。
现在的梯度下降都是mini-batch,Keras模块中出现的batch_size,也为此意。
注:Keras中用的优化器SGD是stochastic gradient descent的缩写,但这里并不代表是一个样本就更新一回,而是基于mini-batch的。