本文基于http://keras-cn.readthedocs.io/en/latest/for_beginners/concepts/提及的知识总结,感谢作者做出的贡献,如有侵权将立即删除

符号计算

Keras的底层库使用Theano或TensorFlow,这两个库也称为Keras的后端。无论是Theano还是TensorFlow,都是一个“符号式”的库。

因此,这也使得Keras的编程与传统的Python代码有所差别。笼统的说,符号主义的计算首先定义各种变量,然后建立一个“计算图”,计算图规定了各个变量之间的计算关系。建立好的计算图需要编译以确定其内部细节,然而,此时的计算图还是一个“空壳子”,里面没有任何实际的数据,只有当你把需要运算的输入放进去后,才能在整个模型中形成数据流,从而形成输出值。

Keras的模型搭建形式就是这种方法,在你搭建Keras模型完毕后,你的模型就是一个空壳子,只有实际生成可调用的函数后(K.function),输入数据,才会形成真正的数据流。

使用计算图的语言,如Theano,以难以调试而闻名,当Keras的Debug进入Theano这个层次时,往往也令人头痛。没有经验的开发者很难直观的感受到计算图到底在干些什么。尽管很让人头痛,但大多数的深度学习框架使用的都是符号计算这一套方法,因为符号计算能够提供关键的计算优化、自动求导等功能。

张量

张量,或tensor

规模最小的张量是0阶张量,即标量,也就是一个数。

当我们把一些数有序的排列起来,就形成了1阶张量,也就是一个向量

如果我们继续把一组向量有序的排列起来,就形成了2阶张量,也就是一个矩阵

把矩阵摞起来,就是3阶张量,我们可以称为一个立方体,具有3个颜色通道的彩色图片就是一个这样的立方体

把立方体摞起来,好吧这次我们真的没有给它起别名了,就叫4阶张量了,不要去试图想像4阶张量是什么样子,它就是个数学上的概念。

张量的阶数有时候也称为维度,或者轴,轴这个词翻译自英文axis。譬如一个矩阵[[1,2],[3,4]],是一个2阶张量,有两个维度或轴,沿着第0个轴(为了与python的计数方式一致,本文档维度和轴从0算起)你看到的是[1,2],[3,4]两个向量,沿着第1个轴你看到的是[1,3],[2,4]两个向量。

要理解“沿着某个轴”是什么意思,不妨试着运行一下下面的代码:

import numpy as np

a = np.array([[1,2],[3,4]])
sum0 = np.sum(a, axis=0)
sum1 = np.sum(a, axis=1)

print sum0
print sum1
Keras学习-1

data_format

这是一个无可奈何的问题,在如何表示一组彩色图片的问题上,Theano和TensorFlow发生了分歧,'th'模式,也即Theano模式会把100张RGB三通道的16×32(高为16宽为32)彩色图表示为下面这种形式(100,3,16,32),Caffe采取的也是这种方式。第0个维度是样本维,代表样本的数目,第1个维度是通道维,代表颜色通道数。后面两个就是高和宽了。这种theano风格的数据组织方法,称为“channels_first”,即通道维靠前。

而TensorFlow,的表达形式是(100,16,32,3),即把通道维放在了最后,这种数据组织方式称为“channels_last”。

Theano : (100,3,16,32)  "channels_first"

TensorFlow : (100,16,32,3) "channels_last"

 

函数式模型

Keras 0.x的版本中,存在两种模型:

1.一种叫Sequential(序贯模型),单输入单输出,层与层之间只有相邻关系,没有跨层连接,编译速度较快。

2.第二种叫Graph(图模型),多输入多输出,存在跨层连接,编译速度较慢。

序贯模型是图模型的一种特殊情况。

Keras 1.x 和 2.x版本中,Graph(图模型)被废弃,增加了“functional model API”其利用“函数式编程风格”。

 

batch

深度学习的优化算法,即梯度下降,一般来说有两种方式
1.Batch gradient descent 遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度,这种方式每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习。
2.Stochastic gradient descent 每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,这种方式速度比较快,但是收敛性不好,可能在最优点附近晃动,hit不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡比较剧烈。
为了克服两种方法的缺点,现一般采取一种折中手段,mini-batch gradient decent,小批的梯度下降,这种方法把数据分为若干批,按批来更新参数,一批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面,分批的数据的样本数相比于整个数据集来说小了很多,计算量也不是很大。Keras中用的优化器SGD是stochastic gradient descent的缩写,但不代表是一个样本就更新一回,还是基于mini-batch的。

epochs

epochs指的就是训练过程中数据将被“轮”多少次