本篇博文旨在保存笔记,以便日后查阅,如有不当之处,敬请指出!
backend
Keras 是一个模型级库,为开发深度学习模型提供了高层次的构建模块。它不处理诸如张量乘积和卷积等低级操作。而我们常常在自定义损失函数或者评价指标时需要对张量进行一些操作,此时就需要借助keras的后端接口调用,实现像tensorflow里面的那些张量操作。本文以tensorflow作为后端为例。
首先,导入keras的backend,通常将其命名为K
。
import keras.backend as K
这里就简单展示两个最近使用到的操作,更多可以参考Keras中文文档。
- K.sum(x, axis=None, keepdims=False)
计算张量在某一指定轴的和,默认axis=None,即计算x中所有元素的和,功能同tf.reduce_sum()。
- 参数解释:
- x: 张量或变量。
- axis: 一个整数,需要加和的轴。
- keepdims: 布尔值,是否保留原尺寸。 如果
keepdims
为False
,则张量的秩减 1。 如果keepdims
为True
,缩小的维度保留为长度 1。
- 返回:
- 一个张量
- K.abs(x)
取绝对值操作。
- 参数解释:
- x: 张量或变量。
- 返回:
- 一个张量
- K.square()
取平方操作。
- 参数解释:
- x: 张量或变量。
- 返回:
- 一个张量。
weights
有时需要用到网络模型的权重,假设model
是一个已经搭建好的模型,我们可以通过以下函数设置和获取模型网络权重。
model.get_weights()
model.set_weights(weights)
- get_weights():以Numpy的array形式返回模型的权重张量列表。
- 示意图
- set_weights():设置模型的权重,以列表形式,列表元素类型为Numpy arrays。
layer
查看网络结构除了使用model.summary()
,还可以打印出网络结构。
- model.layers
- 示意图
获取网络的某一层,可以使用model.get_layer()。
- model.get_layer(name=None, index=None)
通过名称或者索引来检索网络层。
- 参数解释
- name: 网络层的名称,String类型
- index: 网络层的索引,Integer类型
例如:
model.get_layer('dense_2').kernel
model.get_layer('dense_2').bias
model.get_layer(index=9)
loss
这里主要介绍怎么给添加loss
,这里说的损失通常指的是正则项。比如说你想给模型添加一个正则项,但是又苦于写不出自定义损失函数,就可以使用这种方法。
以keras-bert为例,假如想给模型添加正则项
def build_bert(nclass):
bert_model = load_trained_model_from_checkpoint(config_path, checkpoint_path, seq_len=None)
original_weights = bert_model.get_weights().copy()
original_weights_len = len(original_weights)
print("original weights'length:", original_weights_len)
for l in bert_model.layers:
# print(l)
l.trainable = True
x1_in = Input(shape=(None,))
x2_in = Input(shape=(None,))
x = bert_model([x1_in, x2_in])
x = Lambda(lambda x: x[:, 0])(x)
p = Dense(nclass, activation='softmax', kernel_initializer=glorot_uniform(seed=seed))(x)
model = Model([x1_in, x2_in], p)
print(print("current weights'length:", len(model.get_weights())))
# add penalty
for i, weights in enumerate(model.get_weights()):
if original_weights_len > i:
partial_loss = K.sum(1.0 * K.abs(weights - original_weights[i]))
model.add_loss(partial_loss)
else:
model.add_loss(K.sum(1.0 * K.square(weights)))
model.compile(loss='categorical_crossentropy',
optimizer=Adam(1e-5), # lr: 5e-5 3e-5 2e-5 epoch: 3, 4 batch_size: 16, 32
metrics=['accuracy', acc_top2])
print(model.summary())
return model
output
有些任务中需要获取模型输出以进行下一步操作,有如下两种方式:
- model.get_layer(index=9).output
该实例中,第9层模型也就是模型的最后一层——输出层。 - model.outputs
model.get_layer(index=9).output
model.outputs
注:以上所有方法都可在官方文档检索查看。