初识Keras

Conceptions:

 

Keras:基于Theano和TensorFlow的深度学习库

Keras是一个高层神经网络API,Keras由纯Python编写而成并基TensorFlow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,如果你有如下需求,请选择Keras:

  • 简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)

  • 支持CNN和RNN,或二者的结合

  • 无缝CPU和GPU切换

Keras适用的Python版本是:Python 2.7-3.6

Keras的设计原则是

  • 用户友好:Keras是为人类而不是天顶星人设计的API。用户的使用体验始终是我们考虑的首要和中心内容。Keras遵循减少认知困难的最佳实践:Keras提供一致而简洁的API, 能够极大减少一般应用下用户的工作量,同时,Keras提供清晰和具有实践意义的bug反馈。

  • 模块性:模型可理解为一个层的序列或数据的运算图,完全可配置的模块可以用最少的代价自由组合在一起。具体而言,网络层、损失函数、优化器、初始化策略、**函数、正则化方法都是独立的模块,你可以使用它们来构建自己的模型。

  • 易扩展性:添加新模块超级容易,只需要仿照现有的模块编写新的类或函数即可。创建新模块的便利性使得Keras更适合于先进的研究工作。

  • 与Python协作:Keras没有单独的模型配置文件类型(作为对比,caffe有),模型由python代码描述,使其更紧凑和更易debug,并提供了扩展的便利性。

因此,在使用keras时,你会觉得你的任务实际上在拼积木构建网络。如下图:

初识Keras

这里我们用 Deep Learing 里面 “Hello World”级别的问题——手写文字分类为例进行讲解。

首先,我们可以去:http://yann.lecun.com/exdb/mnist/ 

下载手写数字的data set, 一共有四个,分别是training images, training labels, testing images, testing labels.

初识Keras

 

1. 首先,我们需要定义一个 function  set(Neural Network)

初识Keras

model = Sequential()  创建一个连续的网络。这里 sequential 代表序惯模型。连续模型

接下来给model 添加Layers。 使用 model.add

>>>>>>input_dim 代表上次层输入的data dimenion

>>>>>>“28*28"代表输入的图片的size是28*28pixels。

>>>>>>out_dim代表下一层的数据维度,如果是500个neturons 输出值就是500.(注意在最新版本中改为units=500)

>>>>>>Activation 选择添加**方程的种类,图中用的是 Sigmod 方程,其实也可以用softplus,linear,relu等等

>>>>>>第二层的之后layer不需要再给input,因为上次层的output 就是下层的input.

>>>>>>最后的output 的dim 应该是10,因为只有10个数字,所以是10维,他会给出每个分类的probablity。

通过添加 Softmax 可以输出最后概率。

Keras 2.0(语法更新)

初识Keras

 

 

 

 

补充: Dense

全连接层(对上一层的神经元进行全部连接,实现特征的非线性组合)

keras.layers.core.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

Dense就是常用的全连接层,所实现的运算是output = activation(dot(input, kernel)+bias)。其中activation是逐元素计算的**函数,kernel````是本层的权值矩阵,bias为偏置向量,只有当use_bias=True```才会添加。

如果本层的输入数据的维度大于2,则会先被压为与kernel相匹配的大小。

    units:大于0的整数,代表该层的输出维度。

    activation:**函数,为预定义的**函数名(参考**函数),或逐元素(element-wise)的Theano函数。如果不指定该参数,将不会使用任何**函数(即使用线性**函数:a(x)=x)

    use_bias: 布尔值,是否使用偏置项

# as first layer in a sequential model:

model = Sequential()

model.add(Dense(32, input_shape=(16,)))  #input_shape=(16,)等价于input_dim=16

# now the model will take as input arrays of shape (*, 16) ,输入维度=16

# and output arrays of shape (*, 32) ,输出维度=32

# after the first layer, you don't need to specify

# the size of the input anymore:

model.add(Dense(32)) #这一层的input_shape=(32,)

全连接层(Fully Connected layer)就是使用了softmax激励函数作为输出层的多层感知机(Multi-Layer Perceptron),其他很多分类器如支持向量机也使用了softmax。“全连接”表示上一层的每一个神经元,都和下一层的每一个神经元是相互连接的。全连接层的输出概率之和为1,这是由激励函数Softmax保证的。Softmax函数把任意实值的向量转变成元素取之0-1且和为1的向量。

综上,我们建立了一个Neural Network,其实它本身就是一个function Set.

2. 接下来,我们要进行step2,就是评价一下,这个function set的好坏。

初识Keras

 model.compile()用于评价一个function的好坏,包括 loss function。optimizer(实时跟新learing rate方法),以及metrics 的方法。optimizer 包括 SGD, RMSProp, Adagrad, Adadelta, Adam, Adamax, Nadam

这里使用了 交叉熵 作为损失函数, adam作为optimzer, "准确性"作为metrics的评价指标。

3. 确定一个好的function

初识Keras

其中X_train 就是image, y_train 就是label. 我们可以仔细的分析一下这个x_train 和y_train。

初识Keras

   首先,我们需要将一个image data(X_train)转变为以numpy array. 这个array的shape应该为(N*,m*m)其中N* 代表样本的数量,m*m就是图片的像素大小,我们也可以将其理解为features的数量。

y_train也是一个numpy array, shape为第一数字代表数目,第二个为特征值10维数组,也就是100000000.代表1

接下来介绍 batch 和 epoch.

我们把整个dataset 分为多个小的batch, 分别做loss function 的 GD, 每一个batch 更新完成一次叫做一个epoch.

>>>>batch_size 表示每个batch随机包含多少的data.

>>>>nb_epoch表示更新多少次。

如下图所示:

初识Keras

 

 

初识Keras

WHY WE USE  MINI-BATCH  RATHER THAN SGD??

 如果我们用SGD, 每次计算一个点需要更新一次数据。需要大量的CPU运算。

但是如果我们将其分解为一个个小batch, batch的整体输入可以作为一个矩阵给GPU, 从而做平行运算,速度大于CPU。

如图

初识Keras

 

4. 如何保存使用 keras

初识Keras

 

其中, score 的OUTPUT 一个2维Vector, 第一个是Loss, 第二个是Accuracy。