keras 定义激活函数及layer

简介: 自定义激活函数通过定义个操作 Tensor 的函数,然后将其添加到 keras 系统中即可。from keras.utils.generic_utils import get_custom_objectsdef binary(x): # 注: tf.

自定义激活函数

通过定义个操作 Tensor 的函数,然后将其添加到 keras 系统中即可。

from keras.utils.generic_utils import get_custom_objects

def binary(x):
    # 注: tf.greater 函数没有 gradient 函数,因此在运行时候会报错
    # ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient 
    # defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
    return K.cast(tf.greater(x, 0), tf.uint8)

# custom activation function
get_custom_objects().update({'binary': Activation(binary)})

自定义层

在 keras 层中除去输入层以外,不能使用没有定义 gradient 函数的函数,否则会报错。

因此如下层只能做 Input 层使用:

class MaskLayer(Layer):
    """
    输入与输出维度一致
    输出为 0/1
    """
    def __init__(self, **kwargs):
        self.weight_m = None
        super(MaskLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        self.weight_m = self.add_weight(name='m_weight',
                                        shape=(input_shape[-1], input_shape[-1]),
                                        initializer='glorot_uniform',
                                        trainable=True)
        self.weight_b = self.add_weight(name='m_bias',
                                        shape=(input_shape[-1], ),
                                        initializer='glorot_uniform',
                                        trainable=True)
        super(MaskLayer, self).build(input_shape)

    def call(self, x, **kwargs):
        m = K.dot(x, self.weight_m) + self.weight_b
        m = tf.layers.batch_normalization(m)

        # 注: tf.greater_equal 函数没有 gradient 函数,因此在运行时候会报错
        # ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient 
        # defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
        return K.cast(K.greater_equal(x, 0), tf.uint8)

    def compute_output_shape(self, input_shape):
        return input_shape

对于Layer的定义也可以通过 Activation 定义的方式一样,通过 get_custom_objects 的方式添加到 keras 系统中去。

自定义初始化函数

from keras import backend as K
import numpy as np

def my_init(shape, name=None):
    value = np.random.random(shape)
    return K.variable(value, name=name)

model.add(Dense(64, init=my_init))

这里主要能初始化的内容是 float 数据类型

获取上层输出维度

简单的通过 python 命令行,查看下 Layer 属性相关内容:

>>> from tensorflow.keras.layers import Input, Dense
/srv/anaconda/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
>>> inp = Input(shape=(3,))
>>> inp
<tf.Tensor 'input_1:0' shape=(?, 3) dtype=float32>
>>> inp.shape
TensorShape([Dimension(None), Dimension(3)])
>>> m = Dense(10)(inp)
>>> m.shape
TensorShape([Dimension(None), Dimension(10)])

在 Layer 定义过程中使用上层输出来做为本层的维度定义, 比如:

from keras.models import Model
from keras.layers import Input, Dense, Conv2D, Flatten, MaxPool2D

inp = Input(shape=(20, 20, 1, ))
m = Conv2D(16, kernel_size=(3, inp.shape[2].value))(inp)
m = MaxPool2D(pool_size=(m.shape[1].value, 1))(m)
m = Flatten()(m)
outp = Dense(m.shape[-1].value)(m)
model = Model(inputs=inp, outputs=outp)
model.summary()

输出如下内容:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         (None, 20, 20, 1)         0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 18, 1, 16)         976       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 1, 1, 16)          0         
_________________________________________________________________
flatten (Flatten)            (None, 16)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 16)                272       
=================================================================
Total params: 1,248
Trainable params: 1,248
Non-trainable params: 0
_________________________________________________________________
目录
相关文章
|
3月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch基础之激活函数模块中Sigmoid、Tanh、ReLU、LeakyReLU函数讲解(附源码)
PyTorch基础之激活函数模块中Sigmoid、Tanh、ReLU、LeakyReLU函数讲解(附源码)
189 0
|
26天前
ReLU函数
【7月更文挑战第24天】ReLU函数。
26 1
|
1月前
|
计算机视觉
【YOLOv10改进-卷积Conv】动态蛇形卷积(Dynamic Snake Convolution)用于管状结构分割任务
YOLOv10专栏介绍了一种用于精确分割管状结构的新方法DSCNet,它结合了动态蛇形卷积、多视角融合和拓扑连续性约束损失。DSConv创新地聚焦细长局部结构,增强管状特征感知,而多视角融合和TCLoss则改善了全局形态理解和分割连续性。在2D和3D数据集上的实验显示,DSCNet在血管和道路等分割任务上超越了传统方法。DySnakeConv模块整合到YOLOv10中,提升了目标检测的准确性。[链接指向详细文章](https://blog.csdn.net/shangyanaf/article/details/140007047)
|
3月前
|
机器学习/深度学习 TensorFlow API
Keras 的模型(Model)和层(Layers)的介绍
Keras 的模型(Model)和层(Layers)的介绍
76 1
|
3月前
|
机器学习/深度学习 人工智能 PyTorch
基于torch.nn.Dropout通过实例说明Dropout丢弃法(附代码)
基于torch.nn.Dropout通过实例说明Dropout丢弃法(附代码)
67 0
|
9月前
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch torch.nn库以及nn与nn.functional有什么区别?
Pytorch torch.nn库以及nn与nn.functional有什么区别?
63 0
|
机器学习/深度学习 PyTorch 算法框架/工具
pytorch中nn.ReLU()和F.relu()有什么区别?
pytorch中nn.ReLU()和F.relu()有什么区别?
450 0
|
PyTorch 算法框架/工具
PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
467 2
PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
|
机器学习/深度学习 PyTorch 算法框架/工具
【PyTorch】nn.ReLU()与F.relu()的区别
【PyTorch】nn.ReLU()与F.relu()的区别
133 0
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch中使用torch.nn模块进行神经网络模型初步构造
Pytorch中使用torch.nn模块进行神经网络模型初步构造
95 0
Pytorch中使用torch.nn模块进行神经网络模型初步构造