Keras深度学习框架(介绍)
keras是一个高层次的深度学习模块,底层依赖Theano(默认)或TensorFlow调用,封装了Theano中的功能,简化深度学习相关功能的调用。
Sequential : 用于组合一系列layers,是keras最基础的类。 最常用的网络定义模式如下:
models = Sequential()
models.add(Dense(32, input_dim=784)) # 添加model1
models.add(Activation('relu')) # 添加model2
# 添加其它model
...
# 定义模型
models.compile(optimizer='sgd',loss='categorical_crossentropy', metric=['accuracy'])
# 训练模型
models.fit(train_x, train_y, nb_epoch, batch_size)
# 输出预测
y_pred = models.predict_class(test_x)
通过非常清晰简单的方式,我们就可以定义一个深度学习网络(models.add),定义它的优化方式(models.compile),然后训练模型(models.fit),最后应用预测(models.predict)。问题的核心仍然在网络构建本身,但通过预定义的model(例如Dense, Activation)使得网络定义本身也得到了简化。
下面本文介绍下keras主要的应用模块。
1.layer本身相关部分
所有layer都有一些公有函数: (1) get_weights() 返回层中神经元的权值,numpy.array (2) set_weights() 设置层中神经元的权值 (3) get_config() 返回layer的配置
如果layer是非共享的,那么可以通过
layer.input
layer.output
layer.input_shape
layer.output_shape
获取层的输入张量,输出张量,输入形状,输出形状。 如果layer是共享的,那么通过 get_xx_at(node_index) 获取指定node的信息。
(1)Dense:较常用的一种Neutral Network layer。
定义
keras.layers.core.Dense(output\_dim,
init='glorot\_uniform', activation='linear', weights=None ...)
主要参数:
output_dim:输出向量
input_dim:输入向量
activation: 定义传递函数,如果不指定,默认为linear, f(x)=x
调用实例,输入节点16个,输出节点32个:
model = Sequential()
model.add(Dense(32, input_dim=16))
(2)Activation: 定义激活函数activation:
keras.layers.core.Activation(activation)
输入层和输出层维度保持一致。
Dropout: 在模型训练的时候使得部分节点的权重不更新,包含参数p,取值范围是[0,1],指定一定比例的训练样本不用于节点更新,避免过拟合。
keras.layers.core.Dropout(p)
主要参数:
p:[0, 1], 指定一定比例的样本不用于更新
其它相关函数可以参考这里。
2.卷积相关layer定义 (1)Convolution1(/2/3)D :卷积操作,分别针对1维、2维和3维的输入操作。
keras.layers.convolutional.Convolution1D(nb_filter, filter_length, init='uniform', activation='linear', weights=None, border_mode='valid', subsample_length=1, W_regularizer=None, b_regularizer=None, activity_regularizer=None, W_constraint=None, b_constraint=None, bias=True, input_dim=None, input_length=None)
主要参数:
nb_filter:指定卷积核的个数(等价于输出的维度)
卷积核的形状:
一维是长度:filter_length
二维是形状:nb_row, nb_col
三维是形状:kernel_dim1/2/3
输入形状:
一维例如:(10,30),前者是样本数量,后者是每个样本的维度
二维例如:(3,256,256),前者是样本数量,后面两项是图像的长宽
(2)MaxPooling(½/3)D / AveragePooling(½/3)D:主要解释下pooling,它有点像是降采样,把一定区域内的特征按max或average的方法变为一个特征,用于降低处理的数据量。
3.optimizer
定义keras模型的优化方法,keras支持两种类型的输入, (1) 指定optimizer类的实例,如:
model = Sequential()
#...
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_square_error', optimizer=sgd)
(2) 指定optimizer类的名称,如:
model = Sequential()
model.compile(loss='mean_square_error', optimizer='sgd')
可选的optimizer方法包括SGD, RMSprop,Adagrad,Adadelta等,这些方法主要的区别在于learning rate的计算,learning rate作为超参数的一种,在早期的神经网络中并不能通过网络本身学习,而是通过使用者的经验(调参)决定,因此learning rate的计算方法本身也是深度学习重要的研究方向之一。简单的理解(或者说以我的理解),learning rate可以采取固定值(经验参数,策略一),也可以采用前期跨度大,后期跨度小(策略二),类似的不同策略衍生出不同的optimizer,更详细的科学解释可见这里。
4.objective
定义keras模型的损失函数。同optimizer,keras也支持两种类型的输入: (1) objective的名称,常用的如:
mean_square_error/mse
binary_crossentropy
categorical_crossentropy
(2) Theano/TensorFlow的函数,类似如下:
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
5.activation
神经网络中的激活函数(=转移函数),常用的比如:
model = Sequential()
model.add(Dense(64, activation='tanh'))
添加了tanh作为激活函数。这里同样可以传入函数对象:
def tanh(x):
return K.tanh(x)
model.add(Dense(64, activation=tanh))
model.add(Activation(tanh))
6.initializations
网络层的初始权值,不同层可以定义不同的权值分布,例如:
model.add(Dense(64, init='uniform'))
定义一个包含64个节点,初始权值一致的网络层。
7.compile函数 objective和optimizer是compile函数必须的两项输入参数,例如:
model = Sequential()
model.compile(loss='mean_square_error', optimizer='sgd')