Keras自定义Layer使用说明

自定义 Layer

自定义激活函数

函数形式比较简单的时候可以用lambda函数:

clipped_relu = lambda x: K.activations.relu(x, max_value=4000)

Layer类

class MLPBlock(Layer):

    def __init__(self):
        super(MLPBlock, self).__init__()
        self.dense_1 = K.layers.Dense(500, kernel_regularizer=regularizers.l2(0.0))
        self.dense_2 = K.layers.Dense(500, kernel_regularizer=regularizers.l2(0.0))
        self.dense_3 = K.layers.Dense(500, kernel_regularizer=regularizers.l2(0.0))
        self.dense_4 = K.layers.Dense(500, kernel_regularizer=regularizers.l2(0.0))
        self.dense_5 = K.layers.Dense(60)

    def call(self, inputs):
        x = self.dense_1(inputs)
        x = tf.nn.relu(x)

        x = self.dense_2(x)
        x = tf.nn.relu(x)

        x = self.dense_3(x)
        x = tf.nn.relu(x)

        x = self.dense_4(x)
        x = tf.nn.relu(x)

        x = self.dense_5(x)
        return clipped_relu(x)

建立模型

这一步比较关键, 之前不成功主要是因为没有理解def call(self, inputs)这个类方法. 以下代码会报错:

input_layer = K.Input(shape=(8,))
output_layer = MLPBlock()
mdl = K.Model(input_layer, output_layer)
mdl.summary()

这是因为output_layer未被初始化, 不含input_shape这个重要信息, 只有当我们把input_layer作为参数传入自定义的output_layer时, output_layer才会被实际地初始化. 因此

input_layer = K.Input(shape=(8,))
output_layer = MLPBlock()(input_layer)
mdl = K.Model(input_layer, output_layer)
mdl.summary()

可以看到, 我们自定义的由多层Dense Layer叠加(stack)起来的新的Layer, 在形式上被作为一个新的Layer.

Model: "model_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_8 (InputLayer)         [(None, 8)]               0
_________________________________________________________________
mlp_block_17 (MLPBlock)      (None, 60)                786060
=================================================================
Total params: 786,060
Trainable params: 786,060
Non-trainable params: 0
_________________________________________________________________

这里有一个重要的bug, 或者说kerastf.keras不同的地方. 以上代码适用于tf.keras, 如果使用的是keras, mlp_block_17 (MLPBlock)Output Shape(None, 8), 而不是(None, 60). 有人在github上发现了相同的问题:https://github.com/tensorflow/tensorflow/issues/33785

二者的API可能略有不同, 如果查看Keras官方主页的说明:https://keras.io/layers/writing-your-own-keras-layers/, 在自定义Layer时, 还需要定义一个def compute_output_shape, 在tf.keras中没有这一步, 官方教程(https://www.tensorflow.org/guide/keras/custom_layers_and_models)里也没有这一步. 换言之, 如果使用tf.keras, output_shape能够自动得到. 因此如果使用的是keras而不是tf.keras, 记得定义def compute_output_shape

原文地址:https://www.cnblogs.com/yaos/p/12142673.html

时间: 2024-10-12 04:38:49

Keras自定义Layer使用说明的相关文章

自定义Layer的两种方法

view的完整显示过程: 1.view.layer会准备一个Layer Graphics Context(图层类型上下文) 2.调用view.layer.delegate(即view)的drawLayer:inContext:并传入准备好的上下文 3.view的drawLayer:inContext:方法内部会调用view的drawRect:方法 4.view就可以在drawRect:方法中实现绘图,所有东西都会绘制到view.layer上 5.系统再将view.layer内容拷贝到屏幕上,完成

iOS开发UI篇—CAlayer(自定义layer)

iOS开发UI篇—CAlayer(自定义layer) 一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的DrawRect:方法,然后在该方法中画图. 绘制图形的步骤: (1)获取上下文 (2)绘制图形 (3)渲染图形 如果在layer上画东西,与上面的过程类似. 代码示例: 新建一个类,让该类继承自CALayer YYMylayer.m文件 1 // 2 // YYMylayer.m 3 // 05-自定义l

iOS 自定义layer的两种方式

在iOS中,你能看得见摸得着的东西基本都是UIView,比如一个按钮,一个标签,一个文本输入框,这些都是UIView: 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个图层 @property(nonatomic,readonly,retain) CALayer *layer; 每一个UIView内部都默认关联一个CALayer,我们可称这个Laye

CAlayer(自定义layer)

CAlayer(自定义layer) 一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的DrawRect:方法,然后在该方法中画图. 绘制图形的步骤: (1)获取上下文 (2)绘制图形 (3)渲染图形 如果在layer上画东西,与上面的过程类似. 代码示例: 新建一个类,让该类继承自CALayer YYMylayer.m文件 8 9 #import "YYMylayer.h" 10 11 @imple

自定义Keras Layer

Keras的Layer其实就是一个Class, 要具有以下几个方法: (1) build(input_shape): 定义权重的地方, 如果不需要定义权重, 也要有self.built = True; (2) call(x): 编写功能逻辑的地方, 实现Layer的功能逻辑; (3) compute_output_shape(input_shape): 根据input_shape, 计算形状变化的地方, 能够让Keras推断输出的Tensor的Shape. 原文地址:https://www.cn

keras中保存自定义层和loss

在keras中保存模型有几种方式: (1):使用callbacks,可以保存训练中任意的模型,或选择最好的模型 logdir = './callbacks' if not os.path.exists(logdir): os.mkdir(logdir) output_model_file = os.path.join(logdir, "xxxx.h5") callbacks = [ tf.keras.callbacks.ModelCheckpoint(output_model_file

Keras Layer 的 call(x) 和 input_shape

今天用Keras编程的时候发现一个问题, ··· input_layer = K.layers.Input(shape=(10,)) x = K.layers.Dense(20)(input_layer) x = K.layers.Dense(20)(x) ··· 以上写法是可行的,但是以下写法却不行 L = K.layers.Dense(20) y = L(input_layer) y = L(y) 前两个表达式正常,到了第3个表达式y=L(y)的时候就报input_shape错误.百思不得其

使用Keras训练神经网络备忘录

使用Keras训练神经网络备忘录 小书匠 深度学习 文章太长,放个目录: 1.优化函数的选择 2.损失函数的选择 2.2常用的损失函数 2.2自定义函数 2.1实践 2.2将损失函数自定义为网络层 3.模型的保存 3.1同时保持结构和权重 3.2模型结构的保存 3.3模型权重的保存 3.5选择网络层载入 4.训练历史的保存 4.1检测运行过程的参数 4.2保持训练过程得到的所有数据 5.陷阱:validation_split与shuffle 1.优化函数的选择 先写结论,后面再补上每个优化函数的

keras中的mask操作

使用背景 最常见的一种情况, 在NLP问题的句子补全方法中, 按照一定的长度, 对句子进行填补和截取操作. 一般使用keras.preprocessing.sequence包中的pad_sequences方法, 在句子前面或者后面补0. 但是这些零是我们不需要的, 只是为了组成可以计算的结构才填补的. 因此计算过程中, 我们希望用mask的思想, 在计算中, 屏蔽这些填补0值得作用. keras中提供了mask相关的操作方法. 原理 在keras中, Tensor在各层之间传递, Layer对象