转载自http://blog.csdn.net/lk7688535/article/details/52862377,仅用作个人学习。
keras是一个开源是的python深度学习库,可以基于theano或者tenserflow,下面大体介绍下keras的几个重要模块
重要的模块
1、优化器(optimizers)
优化器是调整每个节点权重的方法,看一个代码示例:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
可以看到优化器在模型编译前定义,作为编译时的两个参数之一
代码中的sgd是随机梯度下降算法
lr表示学习速率
momentum表示动量项
decay是学习速率的衰减系数(每个epoch衰减一次)
Nesterov的值是False或者True,表示使不使用Nesterov momentum
以上4个参数以后具体学习了再解析
除了sgd,还可以选择的优化器有RMSprop(适合递归神经网络)、Adagrad、Adadelta、Adam、Adamax、Nadam
2、目标函数(objectives)
目标函数又称损失函数(loss),目的是计算神经网络的输出与样本标记的差的一种方法,代码示例:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
mean_squared_error就是损失函数的名称
可以选择的损失函数有:
mean_squared_error,mean_absolute_error,squared_hinge,hinge,binary_crossentropy,categorical_crossentropy
这里binary_crossentropy 和 categorical_crossentropy也就是logloss
3、激活函数(activations)
每一个神经网络层都需要一个激活函数,代码示例:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
可以选择的激活函数有:
linear、sigmoid、hard_sigmoid、tanh、softplus、relu、 softplus,softmax、softsign
还有一些高级激活函数,比如如PReLU,LeakyReLU等
4、参数初始化(Initializations)
这个模块的作用是在添加layer时调用init进行这一层的权重初始化,有两种初始化方法
4.1 通过制定初始化方法的名称:
示例代码:
- 1
- 1
可以选择的初始化方法有:
uniform、lecun_uniform、normal、orthogonal、zero、glorot_normal、he_normal等
4.2 通过调用对象:
该对象必须包含两个参数:shape(待初始化的变量的shape)和name(该变量的名字),该可调用对象必须返回一个(Keras)变量,例如K.variable()返回的就是这种变量,示例代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
所以说可以通过库中的方法设定每一层的初始化权重,
也可以自己初始化权重,自己设定的话可以精确到每个节点的权重,
那么是否可以在这儿做文章优化特征呢?我觉得可以针对不同的task深入试验看看
5、层(layer)
keras的层主要包括:
常用层(Core)、卷积层(Convolutional)、池化层(Pooling)、局部连接层、递归层(Recurrent)、嵌入层( Embedding)、高级激活层、规范层、噪声层、包装层,当然也可以编写自己的层
5.1对于层的操作
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
5.2 Dense层(全连接层)
- 1
- 1
output_dim:输出数据的维度
init:初始化该层权重的方法
activation:该层的激活函数
weights:numpy array的list。该list应含有一个形如(input_dim,output_dim)的权重矩阵和一个形如(output_dim,)的偏置向量
regularizer:正则项,w为权重的、b为偏执的,activity为输出的
constraints:约束项
bias:是否包含偏执向量,是布尔值
input_dim:输入数据的维度
5.3 dropout层
keras.layers.core.Dropout(p)
为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时随机断开一定百分比(p)的输入神经元连接,Dropout层用于防止过拟合。
参考文章:http://blog.csdn.net/stdcoutzyx/article/details/49022443理解dropout
5.4 递归层(Recurrent)
递归层包含三种模型:LSTM、GRU和SimpleRNN
5.4.1抽象层,不能直接使用
- 1
- 1
return_sequences:True返回整个序列,false返回输出序列的最后一个输出
go_backwards:True,逆向处理输入序列,默认为False
stateful:布尔值,默认为False,若为True,则一个batch中下标为i的样本的最终状态将会用作下一个batch同样下标的样本的初始状态
5.4.2全连接RNN网络
- 1
- 1
inner_init:内部单元的初始化方法
dropout_W:0~1之间的浮点数,控制输入单元到输入门的连接断开比例
dropout_U:0~1之间的浮点数,控制输入单元到递归连接的断开比例
5.4.3 LSTM层
- 1
- 1
forget_bias_init:遗忘门偏置的初始化函数,Jozefowicz et al.建议初始化为全1元素
inner_activation:内部单元激活函数
5.5 Embedding层
- 1
- 1
只能作为模型第一层
mask_zero:布尔值,确定是否将输入中的‘0’看作是应该被忽略的‘填充’(padding)值,该参数在使用递归层处理变长输入时有用。设置为True的话,模型中后续的层必须都支持masking,否则会抛出异常
5.6 model层(最重要)
model层是最主要的模块,model层可以将上面定义了各种基本组件组合起来
model的方法:
model.summary() : 打印出模型概况
model.get_config() :返回包含模型配置信息的Python字典
model.get_weights():返回模型权重张量的列表,类型为numpy array
model.set_weights():从numpy array里将权重载入给模型
model.to_json:返回代表模型的JSON字符串,仅包含网络结构,不包含权值。可以从JSON字符串中重构原模型:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
model.to_yaml:与model.to_json类似,同样可以从产生的YAML字符串中重构模型
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
model.save_weights(filepath):将模型权重保存到指定路径,文件类型是HDF5(后缀是.h5)
model.load_weights(filepath, by_name=False):从HDF5文件中加载权重到当前模型中, 默认情况下模型的结构将保持不变。如果想将权重载入不同的模型(有些层相同)中,则设置by_name=True,只有名字匹配的层才会载入权重
keras有两种model,分别是Sequential模型和泛型模型
5.6.1 Sequential模型
Sequential是多个网络层的线性堆叠
可以通过向Sequential模型传递一个layer的list来构造该模型:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
也可以通过.add()方法一个个的将layer加入模型中:
- 1
- 2
- 3
- 1
- 2
- 3
还可以通过merge将两个Sequential模型通过某种方式合并
Sequential模型的方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
5.6.2 泛型模型
Keras泛型模型接口是:
用户定义多输出模型、非循环有向模型或具有共享层的模型等复杂模型的途径
适用于实现:全连接网络和多输入多输出模型
多输入多输出,官方例子给出:预测一条新闻的点赞转发数,主要输入是新闻本身,还可以加入额外输入,比如新闻发布日期,新闻作者等,具体的实现还是看官网文档吧:
http://keras-cn.readthedocs.io/en/latest/getting_started/functional_API/
所以感觉这个模型可以针对特定task搞一些创新哦
泛型模型model的属性:
model.layers:组成模型图的各个层
model.inputs:模型的输入张量列表
model.outputs:模型的输出张量列表
方法:类似序列模型的方法
补充get_layer
get_layer(self, name=None, index=None)
本函数依据模型中层的下标或名字获得层对象,泛型模型中层的下标依据自底向上,水平遍历的顺序。
name:字符串,层的名字
index: 整数,层的下标
函数的返回值是层对象