tensorflow1.14在keras2.2.5实现LayerNormalization

简介

看这篇blog的朋友请首先检查一下tf版本和你的keras版本,还有你的keras写法,我用的是tf.keras这种写法。

不知道有没有人遇到这种问题:
我想用在keras中用layerNorm,因为我的代码实现是tf.keras的这种写法,所以导致keras_layer_normalization这个包并不能很好的使用。

然后我尝试了tf.contrib.layer.layer_norm,报错。

解决方法

这里给出一个比较方便的解决方法,当然也许比较低级,如果有大佬还请赐教。这里我的方法比较简单,对小白比较友好。

LayerNorm代码:

import tensorflow.keras as keras
from keras import backend as K

class LayerNorm(keras.layers.Layer):
    def __init__(self,
                 center=True,
                 scale=False,
                 epsilon=None,
                 gamma_initializer='ones',
                 beta_initializer='zeros',
                 gamma_regularizer=None,
                 beta_regularizer=None,
                 gamma_constraint=None,
                 beta_constraint=None,
                 ):
        super(LayerNorm, self).__init__()
        self.supports_masking = True
        self.center = center
        self.scale = scale
        if epsilon is None:
            epsilon = K.epsilon() * K.epsilon()
        self.epsilon = epsilon
        self.gamma_initializer = keras.initializers.get(gamma_initializer)
        self.beta_initializer = keras.initializers.get(beta_initializer)
        self.gamma_regularizer = keras.regularizers.get(gamma_regularizer)
        self.beta_regularizer = keras.regularizers.get(beta_regularizer)
        self.gamma_constraint = keras.constraints.get(gamma_constraint)
        self.beta_constraint = keras.constraints.get(beta_constraint)
        self.gamma, self.beta = 0., 0.

    def call(self, inputs, **kwargs):
        mean = K.mean(inputs, axis=-1, keepdims=True)
        variance = K.mean(K.square(inputs - mean), axis=-1, keepdims=True)
        std = K.sqrt(variance + self.epsilon)
        outputs = (inputs - mean) / std
        if self.scale:
            outputs *= self.gamma
        if self.center:
            outputs += self.beta
        return outputs

当然如果你用keras并没有从tensorflow中使用,只需要将上述代码中的import进行修改就可以了。

不知道有没有其他方法
大家共勉~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值