本文基于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
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指的就是训练过程中数据将被“轮”多少次
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Keras学习-1 - Python技术站