Dense层
Dense就是常用的全连接层,所实现的运算是output=activation(dot(input,kernel)+bias)。其中activation是逐元素计算的激活函数,kernel是本层的权值矩阵,bias为偏置向量,只有当use_bias=True才会添加。
keras.layers.core.Dense(units,activation=None,use_bias=True,kernel_initializer='glorot_unif)
如果本层的输入数据的维度大于2,则会先被压为与kernel相匹配的大小。
-
units:大于0的整数,代表该层的输出维度。
-
activation:激活函数,为预定义的激活函数名(参考激活函数),或逐元素
(element-wise)的Theano函数。如果不指定该参数,将不会使用任何激活函数(即 使用线性激活函数: a(x)=x)。 -
use_bias:布尔值,是否使用偏置项。
-
kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化
权重的初始化器。参考initializers。 -
bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权
重的初始化器。参考initializers。 -
kernel_regularizer:kernal权重向量的正则化函数,是Regularizer对象。
-
bias_regularizer:bias偏置向量的正则化函数,是Regularizer对象。
-
activity_regularizer:输出函数或激活函数的正则化函数,为Regularizer对象。
-
kernel_constraints:kernal权重向量的约束函数,是Constraints对象。
-
bias_constraints:bias偏移向量的约束函数,是Constraints对象。
kernel_regularizer,bias_regularizer,activity_regularizer,kernel_constraints,
bias_constraints这些参数一般都使用默认值,不需要专门设置。
输入形如(nb_samples,…,input_shape[1])的nD张量,
最常见的情况为(nb_samples,input_dim)的2D张量。
输出形如(nb_samples,…,units)的nD张量,
最常见的情况为(nb_samples,output_dim)的2D张量。
Activation层
Activation层用于设置激活函数,激活函数用于在模型中引入非线性。
激活函数sigmoid与tanh曾经很流行,但现在很少用于视觉模型了,主要原因在于当输入的绝对值较大时,其导数接近于零,梯度的反向传播过程将被中断,出现梯度消散的现象。
Relu
相比于sigmoid与tanh,它有两个优势:
- 没有饱和问题,大大缓解了梯度消散的现象,加快了收敛速度。
- 实现起来非常简单,加速了计算过程。
ReLU有一个缺陷,就是它可能会永远“死”掉:
假如有一组二维数据X(x1,x2)分布在x1:[0,1],x2:[0,1]的区域内,有一组参数W(w1,
w2)对X做线性变换,并将结果输入到ReLU。
F=w1x1+w2x2
如果w1=w2=-1,那么无论X如何取值,F必然小于等于零。那么ReLU函数对F的导数将永远为零。这个ReLU节点将永远不参与整个模型的学习过程。
造成上述现象的原因是
ReLU在负区间的导数为零,为了解决这一问题,人们发明了LeakyReLU,ParametricReLU,RandomizedReLU等变体。他们的中心思想都是为ReLU
函数在负区间赋予一定的斜率,从而让其导数不为零(这里设斜率为alpha)。LeakyReLU就是直接给alpha指定一个值,整个模型都用这个斜率
Dropout层
keras.layers.core.Dropout(rate,noise_shape=None,seed=None)
为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时随机断开一定百分比
(rate)的输入神经元,Dropout层用于防止过拟合。
参数
- rate:0~1的浮点数,控制需要断开的神经元的比例。
- noise_shape:整数张量,为将要应用在输入上的二值Dropoutmask的shape,例如你的输入为(batch_size,timesteps,features),并且你希望在各个时间步上的Dropoutmask都相同,则可传入noise_shape=(batch_size,1,features)。
- seed:整数,使用的随机数种子。
Flatten层
Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过
渡。Flatten不影响batch的大小。
Permute层
keras.layers.core.Permute(dims)
Permute层将输入的维度按照给定模式进行重排,例如,当需要将RNN和CNN网络连接
时,可能会用到该层。
参数
- dims:整数tuple,指定重排的模式,不包含样本数的维度。重拍模式的下标从1开始。例如(2,1)代表将输入的第二个维度重拍到输出的第一个维度,而将输入的第一个维度重
排到第二个维度。
例子
model=Sequential() model.add(Permute((2,1),input_shape=(10,64)))
这时候model.output_shape等于(None,64,10)。
Conv2D层
keras.layers.convolutional.Conv2D(
filters,kernel_size,strides=(1,1),padding=‘valid’,)
目标函数
model.compile(loss=‘mean_squared_error’,optimizer=‘sgd’)
优化器
优化问题指的是,给定目标函数f(x),我们需要找到一组参数x,使得f(x)的值最小。本文以下内容假设读者已经了解机器学习基本知识和梯度下降的原理。
优化器optimizers是编译Keras模型必要的两个参数之一,例如:
fromkerasimportoptimizers
model=Sequential()
model.add(Dense(64,init='uniform',input_shape=(10,)))
model.add(Activation('tanh'))
model.add(Activation('softmax'))
sgd=optimizers.SGD(lr=0.01,decay=1e-6,momentum=0.9,nesterov=True)
model.compile(loss='mean_squared_error',optimizer=sgd)
可以在调用model.compile()之前初始化一个优化器对象,然后传入该函数(如上所示),也可以在调用model.compile()时传递一个预定义优化器名。在后者的情形下,优化器的参数将使用默认值。
SGD
SGD指stochasticgradientdescent,即随机梯度下降,随机的意思是随机选取部分数据集参
与计算,是梯度下降的batch版本。SGD支持动量 参数,支持学习衰减率。
keras.optimizers.SGD(lr=0.01,momentum=0.0,decay=0.0,nesterov=False)
参数
- lr:大于0的浮点数,学习率
- momentum:大于0的浮点数,动量参数
- decay:大于0的浮点数,每次更新后的学习率衰减值
- nesterov:布尔值,确定是否使用Nesterov动量
对于训练数据集,我们首先将其分成n个batch,每个batch包含m个样本。我们每次更新都
利用一个batch的数据,而非整个训练集,即:
- xt+1=xt+Δxt Δxt=-ηgt
其中,η为学习率,gt为x在t时刻的梯度。
这么做的好处在于:
- 当训练数据太多时,利用整个数据集更新往往时间上不显示。batch的方法可以减少机器的压力,并且可以更快地收敛。
- 当训练集有很多冗余时(类似的样本出现多次),batch方法收敛更快。以一个极端情况为例,若训练集前一半和后一半梯度相同。那么如果前一半作为一个batch,后一半作为另一个batch,那么在一次遍历训练集时,batch的方法向最优解前进两个step,而整体的方法只前进一个step。
Adam
Adam是一种基于一阶梯度来优化随机目标函数的算法。
Adam这个名字来源于adaptivemomentestimation,自适应矩估计。概率论中矩的含义是:如果一个随机变量X服从某个分布,X的一阶矩是E(X),也就是样本平均值,X的二阶矩就是E(X^2),也就是样本平方的平均值。Adam算法根据损失函数对每个参数的梯度的一阶矩估计和二阶矩估计动态调整针对于每个参数的学习速率。Adam也是基于梯度下降的方法,
但是每次迭代参数的学习步长都有一个确定的范围,不会因为很大的梯度导致很大的学习步长,参数的值比较稳定。
Adam(AdaptiveMomentEstimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,
每一次迭代学习率都有个确定范围,使得参数比较平稳。
具体实现:
需要:步进值ϵ,初始参数θ,数值稳定量δ,一阶动量衰减系数ρ1,二阶动量衰减系数ρ2
。
其中几个取值一般为:δ=10-8,ρ1=0.9,ρ2=0.999。
中间变量:一阶动量s,二阶动量r,都初始化为0。
每步迭代过程:
- 01.从训练集中的随机抽取一批容量为m的样本{x1,…,xm},以及相关的输出yi。
- 02.计算梯度和误差,更新r和s,再根据r和s以及梯度计算参数更新量。
keras.optimizers.Adam(lr=0.001,beta_1=0.9,beta_2=0.999,epsilon=1e-08)
该优化器的默认值来源于参考文献。
参数
- lr:大于0的浮点数,学习率。
- beta_1/beta_2:浮点数,0<beta<1,通常很接近1。
- epsilon:大于0的小浮点数,防止除0错误。