Keras-backend&weights&layer&loss&output-笔记

本篇博文旨在保存笔记,以便日后查阅,如有不当之处,敬请指出!

backend

Keras 是一个模型级库,为开发深度学习模型提供了高层次的构建模块。它不处理诸如张量乘积和卷积等低级操作。而我们常常在自定义损失函数或者评价指标时需要对张量进行一些操作,此时就需要借助keras的后端接口调用,实现像tensorflow里面的那些张量操作。本文以tensorflow作为后端为例。

首先,导入keras的backend,通常将其命名为K

import keras.backend as K

这里就简单展示两个最近使用到的操作,更多可以参考Keras中文文档

  1. K.sum(x, axis=None, keepdims=False)
    计算张量在某一指定轴的和,默认axis=None,即计算x中所有元素的和,功能同tf.reduce_sum()。
  • 参数解释:
    • x: 张量或变量。
    • axis: 一个整数,需要加和的轴。
    • keepdims: 布尔值,是否保留原尺寸。 如果 keepdimsFalse,则张量的秩减 1。 如果 keepdimsTrue,缩小的维度保留为长度 1。
  • 返回:
    • 一个张量
  1. K.abs(x)
    取绝对值操作。
  • 参数解释:
    • x: 张量或变量。
  • 返回:
    • 一个张量
  1. K.square()
    取平方操作。
  • 参数解释:
    • x: 张量或变量。
  • 返回:
    • 一个张量。

weights

有时需要用到网络模型的权重,假设model是一个已经搭建好的模型,我们可以通过以下函数设置和获取模型网络权重。

model.get_weights() 
model.set_weights(weights) 
  • get_weights():以Numpy的array形式返回模型的权重张量列表。
  • 示意图
    get_weights()
  • set_weights():设置模型的权重,以列表形式,列表元素类型为Numpy arrays。

layer

查看网络结构除了使用model.summary(),还可以打印出网络结构。

  1. model.layers
  • 示意图
    layers
    获取网络的某一层,可以使用model.get_layer()。
  1. 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)

get_layer()

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

有些任务中需要获取模型输出以进行下一步操作,有如下两种方式:

  1. model.get_layer(index=9).output
    该实例中,第9层模型也就是模型的最后一层——输出层。
  2. model.outputs
model.get_layer(index=9).output
model.outputs

output

注:以上所有方法都可在官方文档检索查看。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值