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时,你会觉得你的任务实际上在拼积木构建网络。如下图:
这里我们用 Deep Learing 里面 “Hello World”级别的问题——手写文字分类为例进行讲解。
首先,我们可以去:http://yann.lecun.com/exdb/mnist/
下载手写数字的data set, 一共有四个,分别是training images, training labels, testing images, testing labels.
1. 首先,我们需要定义一个 function set(Neural Network)
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(语法更新)
补充: 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的好坏。
model.compile()用于评价一个function的好坏,包括 loss function。optimizer(实时跟新learing rate方法),以及metrics 的方法。optimizer 包括 SGD, RMSProp, Adagrad, Adadelta, Adam, Adamax, Nadam
这里使用了 交叉熵 作为损失函数, adam作为optimzer, "准确性"作为metrics的评价指标。
3. 确定一个好的function
其中X_train 就是image, y_train 就是label. 我们可以仔细的分析一下这个x_train 和y_train。
首先,我们需要将一个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表示更新多少次。
如下图所示:
WHY WE USE MINI-BATCH RATHER THAN SGD??
如果我们用SGD, 每次计算一个点需要更新一次数据。需要大量的CPU运算。
但是如果我们将其分解为一个个小batch, batch的整体输入可以作为一个矩阵给GPU, 从而做平行运算,速度大于CPU。
如图
4. 如何保存使用 keras
其中, score 的OUTPUT 一个2维Vector, 第一个是Loss, 第二个是Accuracy。