Keras, high-level 的 Neural Network 框架.

文章目录

  • 简介
    • 作者简介
  • 1. Model
    • 1.1 序列模型
    • 1.2 函数式模型
    • 1.3 模型拓扑
  • 2. Layer
    • 2.1 Dense
    • 2.2 activation
    • 2.3 dropout
    • 2.4 batach nomarlization
  • 3. merge layer
    • 3.1 Sequential模型中的merge
    • 3.2 函数式模型中的merge
    • 3.3 各种merge
  • 4. shared layer
  • 5. compile
  • 6.fit
  • 7. callback
  • 8. evaluate
  • 参考

简介

一些特点:

  • 基于backend的高级封装, backend可以是tensorflow.
  • 由于提供了高级封装,方便快速实验.
  • 简洁, 文档丰富
  • 速度慢于原生tensorflow
  • 各种新式trick都有,比如Batch normalization,PReLU等等
  • 架构灵活,model基于一层层的layer叠加,可插拔性十分强

作者简介

keras 之父, google brain 研究员 François Chollet / 他也参与了 TensorFlow 的框架研发.

1. Model

序列模型函数式模型 两种网络拓扑搭建法.
在处理像TextCNN这种 先分支再融合 的网络, 函数式模型更灵活.

1.1 序列模型

  • keras.models.Sequential(Model)
    类. 代表普通的多层前馈神经网络.
  • keras.models.Sequential#add(self,layer)
    方法. 像搭积木一样, 往后加上一层.
model = Sequential()
model.add(Dense(10, activation='relu', input_dim=4))
model.add(Dropout(0.8))
model.add(Dense(5, activation='relu'))
model.add(Dense(3, activation='softmax'))

1.2 函数式模型

与上面对比.

inputs=Input(shape=(FEATURE_DIM,))
dense1=Dense(10, activation='relu', input_dim=4)(inputs)
dense2=Dense(5, activation='relu')(dense1)
outpus=Dense(3, activation='softmax')(dense2)
# type(dense2) 是 Tensor类型, tensorflow.python.framework.ops.Tensor ,与backend有关.
model=Model(inputs=inputs,outputs=outpus)

这种调用方法看起来比较特殊, 因为Layer类拥有__call__()方法, 它的对象就变成了可调用对象.

1.3 模型拓扑

model.summary()
"""
会得到以下输出: 各层的out_shape
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         (None, 4)                 0         
_________________________________________________________________
dense_5 (Dense)              (None, 10)                50        
_________________________________________________________________
dense_6 (Dense)              (None, 5)                 55        
_________________________________________________________________
dense_7 (Dense)              (None, 3)                 18        
=================================================================
Total params: 123
Trainable params: 123
Non-trainable params: 0
_________________________________________________________________
"""

#边写边调试的时候, 可以用`dense2._keras_shape`字段来查看output_shape.
dense2._keras_shape #(None, 5)
# 也可以直接print tensor
print (embedding) #Tensor("embedding_1/Gather:0", shape=(?, 10, 10), dtype=float32)

还可以画图, 见我的另一篇博文,keras 的可视化

2. Layer

2.1 Dense

  • keras.layers.core.Dense(Layer)
    普通的全连接神经网络层.
  • Dense#__init__(self, 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,
    **kwargs)
# 以下两行等价
model.add(Dense(32, input_shape=(784,)))
model.add(Dense(32, input_dim=784))
# 只有首层需要指定输入维度. 后续各层只需指定神经元个数.
Dense(10, activation='relu', input_dim=4)

2.2 activation

  • keras.layers.advanced_activations.PReLU(Layer)
  • keras.activations 模块
    有 softplus, relu, tanh 等.

2.3 dropout

  • keras.layers.core.Dropout(Layer)
    类.
  • Dropout#__init__(self, rate, noise_shape=None, seed=None, **kwargs)
    rate 指的是要扔掉的占比, 而不是keep_rate.

2.4 batach nomarlization

  • keras.layers.normalization.BatchNormalization(Layer)
    类. 对前面一层每个batch的输出作正规化.
  • BatchNormalization#__init__(self,
    axis=-1,
    momentum=0.99,
    epsilon=1e-3,
    center=True,
    scale=True,
    beta_initializer=‘zeros’,
    gamma_initializer=‘ones’,
    moving_mean_initializer=‘zeros’,
    moving_variance_initializer=‘ones’,
    beta_regularizer=None,
    gamma_regularizer=None,
    beta_constraint=None,
    gamma_constraint=None,
    **kwargs)

3. merge layer

详见 keras.legacy.layers.merge 模块的注释说明.

3.1 Sequential模型中的merge

用于多个网络的合并.
每个网络的输出融合起来, 作为后续网络的输入, 继续参与传播与训练. 常见的有 加和,拼接等.

  • keras.legacy.layers.Merge(Layer)
    类. 这个类声明为 deprecated, 我也不知道新的建议用法.
  • keras.legacy.layers.Merge#__init__(self, layers=None, mode=‘sum’, concat_axis=-1,…)
    构造函数.

注意
我们一般不直接处理tensor, 只是layer的叠加. 所以不要错用方法.

  • 以下几个易混淆的是用不到的:

    • keras.layers.merge.Concatenate(_Merge)
      class

    • keras.layers.merge.concatenate(inputs, axis=-1, **kwargs)
      method

    • keras.layers.merge(inputs, mode='sum', concat_axis=-1, dot_axes=-1, output_shape=None, output_mask=None, arguments=None, name=None)
      method

3.2 函数式模型中的merge

from keras.layers import merge,concatenate

def get_merge_model():
    se_in,se_out=get_semantic_tensor()
    num_in,num_out=get_numerical_tensor()
    concatenate_tensor=concatenate([se_out, num_out], axis=1)
    dense1=Dense(units=10,activation='relu')(concatenate_tensor)
    batch_norm1=BatchNormalization()(dense1)
    dense2 = Dense(units=10, activation='relu')(batch_norm1)
    batch_norm2 = BatchNormalization()(dense2)
    output=Dense(units=1)(batch_norm2)

    fusion_model=Model(inputs=[se_in,num_in],outputs=output)
    return fusion_model

3.3 各种merge

  • concatenate
    拼接.
  • dot
    点乘.
    keras.layers.merge.dot(inputs, axes, normalize=False, **kwargs)
    Whether to L2-normalize samples along the dot product axis before taking the dot product. 如果normalize=True, 算出来的就是余弦相似度.
  • average
    求平均. 各层对应元素求合算平均.
  • add
    相加. 各层对应元素相加.

4. shared layer

多个不同的输入共享同样的网络处理. 详见参考[3].
使用举例: 在DSSM中, 输入是[query, {doc_1,doc_2,…,doc_n}]. 只有两个网络, 分别映射两种不同类型的文本. 所以多个doc的输入就要共享第二个网络.
可以与tf的API搭配使用. 比如

self.keras_shared_content_sideinfo_linear_layer = tf.keras.layers.Dense(units=128, input_shape=[128+64+128, ],name='keras_shared_content_sideinfo_linear_layer')
def get_content_emb(self):
	# ...
	content_side_info_concat = tf.concat(content_side_info_tensors, axis=-1)
	emb = self.keras_shared_content_sideinfo_linear_layer(content_side_info_concat)

5. compile

  • keras.models.Sequential#compile(self, optimizer, loss,
    metrics=None,
    … )
    对模型描述进行编译, 然后才能训练.
  • metrics
    常用的有 ‘accuracy’, ‘mae’
  • loss
    详见 keras.losses模块, 常用的有:
    mse = MSE = mean_squared_error
    mae = MAE = mean_absolute_error
    mape = MAPE = mean_absolute_percentage_error

6.fit

  • keras.engine.training.Model#fit(self, x=None,
    y=None,
    batch_size=None,
    epochs=1,
    verbose=1,
    callbacks=None,
    validation_split=0.,
    validation_data=None,
    shuffle=True,
    class_weight=None,
    sample_weight=None,
    initial_epoch=0,
    steps_per_epoch=None,
    validation_steps=None,
    **kwargs)
    训练模型, 类 sklearn 的写法.
    可以加入validation_data, 观察各种指标在训练期间在验证集上的表现. 如 validation_data=([x_1,x_2],[y_1,y_2]),也支持多输入和多输出.
  • verbose
    建议设置为2, 表示每个epoch只输出一行.

7. callback

fit()函数中的callbacks参数可以传入一个list, 包含丰富的callbacks.
keras自带了一些使用的callback实现类.

  • EarlyStopping
    keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, verbose=1, mode='auto')
    并使用各种callback来达到early stop的目的.
  • ModelCheckpoint
    keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
  • save_best_only:当设置为True时,将只保存在验证集上性能最好的模型

8. evaluate

  • keras.engine.training.Model#metrics_names
    字段. 一个模型的多个metric值. 同 compile 阶段的 metric.
  • keras.engine.training.Model#evaluate(self, x, y,
    batch_size=None,
    verbose=1,
    sample_weight=None,
    steps=None)
    Returns the loss value & metrics values for the model in test mode. 与 keras.engine.training.Model#metrics_names 一 一对应.

参考

  1. keras 官方文档
  2. keras 中文文档
  3. keras 官方文档, shared-layers

你可能感兴趣的:(Keras)