Keras Layer自定义

简介: 简单层实现实现一个简单层需要首先继承 layers.Layer 类即可,如下是官方网站上的例子:from keras import backend as Kfrom keras.

简单层实现

实现一个简单层需要首先继承 layers.Layer 类即可,如下是官方网站上的例子:

from keras import backend as K
from keras.engine.topology import Layer
import numpy as np

class MyLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        # Create a trainable weight variable for this layer.
        self.kernel = self.add_weight(name='kernel', 
                                      shape=(input_shape[1], self.output_dim),
                                      initializer='uniform',
                                      trainable=True)
        super(MyLayer, self).build(input_shape)  # Be sure to call this somewhere!

    def call(self, x):
        return K.dot(x, self.kernel)

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_dim)

如上所示, 其中有三个函数需要我们自己实现:

  • build() 用来初始化定义weights, 这里可以用父类的self.add_weight() 函数来初始化数据, 该函数必须将 self.built 设置为True, 以保证该 Layer 已经成功 build , 通常如上所示, 使用 super(MyLayer, self).build(input_shape) 来完成
  • call() 用来执行 Layer 的职能, 即当前 Layer 所有的计算过程均在该函数中完成
  • compute_output_shape() 用来计算输出张量的 shape

正常DL都是一个forward, backword, update 三个流程,而在 keras 中对于单层 Layer 来说,通过将可训练的权应该在这里被加入列表`self.trainable_weights中。其他的属性还包括self.non_trainabe_weights(列表)和self.updates(需要更新的形如(tensor, new_tensor)的tuple的列表)。你可以参考BatchNormalization层的实现来学习如何使用上面两个属性。这个方法必须设置self.built = True,可通过调用super([layer],self).build()实现

loss 以及参数更新

详细查看了下 add_weight 函数实现如下(keras/engine/topology.py):

    def add_weight(self,
                   name,
                   shape,
                   dtype=None,
                   initializer=None,
                   regularizer=None,
                   trainable=True,
                   constraint=None):
        """Adds a weight variable to the layer.
        # Arguments
            name: String, the name for the weight variable.
            shape: The shape tuple of the weight.
            dtype: The dtype of the weight.
            initializer: An Initializer instance (callable).
            regularizer: An optional Regularizer instance.
            trainable: A boolean, whether the weight should
                be trained via backprop or not (assuming
                that the layer itself is also trainable).
            constraint: An optional Constraint instance.
        # Returns
            The created weight variable.
        """
        initializer = initializers.get(initializer)
        if dtype is None:
            dtype = K.floatx()
        weight = K.variable(initializer(shape),
                            dtype=dtype,
                            name=name,
                            constraint=constraint)
        if regularizer is not None:
            self.add_loss(regularizer(weight))
        if trainable:
            self._trainable_weights.append(weight)
        else:
            self._non_trainable_weights.append(weight)
        return weight

从上述代码来看通过 add_weight 创建的参数,通过 regularizer 函数来计算 loss, 如果 trainable 设置 True ,则该生成的 self._trainable_weights, 可以通过 regularizer 来构建 loss

具体训练过程参见: keras/engine/training.py

目录
相关文章
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
torch.nn.Linear的使用方法
torch.nn.Linear的使用方法
132 0
|
1月前
|
机器学习/深度学习
网络层构建(tf.keras.layers)
【8月更文挑战第20天】网络层构建(tf.keras.layers)。
29 2
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
【Tensorflow+Keras】tf.keras.layers.Bidirectional()的解析与使用
本文解析了TensorFlow和Keras中的`tf.keras.layers.Bidirectional()`层,它用于实现双向RNN(如LSTM、GRU)的神经网络结构。文章详细介绍了该层的参数配置,并通过实例演示了如何构建含有双向LSTM层的模型,以及如何使用IMDB数据集进行模型训练和评估。
47 8
|
1月前
|
机器学习/深度学习
【Python-Keras】keras.layers.Dense层的解析与使用
关于Python-Keras库中keras.layers.Dense层的解析与使用。
34 1
|
3月前
|
存储 PyTorch 算法框架/工具
【chat-gpt问答记录】关于pytorch中的线性层nn.Linear()
【chat-gpt问答记录】关于pytorch中的线性层nn.Linear()
72 0
|
4月前
|
机器学习/深度学习 TensorFlow API
Keras 的模型(Model)和层(Layers)的介绍
Keras 的模型(Model)和层(Layers)的介绍
115 1
|
4月前
|
机器学习/深度学习 算法 TensorFlow
浅谈keras的扩展性:自定义keras
keras是一种深度学习的API,能够快速实现你的实验。keras也集成了很多预训练的模型,可以实现很多常规的任务,如图像分类。TensorFlow 2.0之后tensorflow本身也变的很keras化。另一方面,keras表现出高度的模块化和封装性,所以有的人会觉得keras不易于扩展, 比如实现一种新的Loss,新的网络层结构; 其实可以通过keras的基础模块进行快速的扩展,实现更新的算法【2月更文挑战第10天】
66 1
|
10月前
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch torch.nn库以及nn与nn.functional有什么区别?
Pytorch torch.nn库以及nn与nn.functional有什么区别?
76 0
|
PyTorch 算法框架/工具
PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
489 2
PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
|
API 算法框架/工具
越来越火的tf.keras模型,这三种构建方式记住了,你就是大佬!!!
越来越火的tf.keras模型,这三种构建方式记住了,你就是大佬!!!
113 0