一些特点:
keras 之父, google brain 研究员 François Chollet / 他也参与了 TensorFlow 的框架研发.
有 序列模型 与 函数式模型 两种网络拓扑搭建法.
在处理像TextCNN这种 先分支再融合 的网络, 函数式模型更灵活.
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'))
与上面对比.
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__()
方法, 它的对象就变成了可调用对象.
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 的可视化
__init__
(self, units,# 以下两行等价
model.add(Dense(32, input_shape=(784,)))
model.add(Dense(32, input_dim=784))
# 只有首层需要指定输入维度. 后续各层只需指定神经元个数.
Dense(10, activation='relu', input_dim=4)
__init__
(self, rate, noise_shape=None, seed=None, **kwargs)rate
指的是要扔掉的占比, 而不是keep_rate.__init__
(self,详见 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
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
keras.layers.merge.dot(inputs, axes, normalize=False, **kwargs)
normalize=True
, 算出来的就是余弦相似度.多个不同的输入共享同样的网络处理. 详见参考[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)
validation_data=([x_1,x_2],[y_1,y_2])
,也支持多输入和多输出.fit()
函数中的callbacks参数可以传入一个list, 包含丰富的callbacks.
keras自带了一些使用的callback实现类.
keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, verbose=1, mode='auto')
keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
loss value
& metrics values
for the model in test mode. 与 keras.engine.training.Model#metrics_names
一 一对应.