如何在TF2.X中实现自定义Keras正则化器?

如何在TF2.X中实现自定义Keras正则化器?,keras,tensorflow2.0,Keras,Tensorflow2.0,我试图实现分布式学习的自定义正则化函数,以实现等式中的惩罚函数 我将上述函数实现为一个分层正则化器,但它会给我带来错误。期待社区的帮助 @tf.keras.utils.register_keras_serializable(package='Custom', name='esgd') def esgd(w, wt, mu): delta = tf.math.square(tf.norm(w-wt)) rl = (mu/2)*delta return rl def mo

我试图实现分布式学习的自定义正则化函数,以实现等式中的惩罚函数

我将上述函数实现为一个分层正则化器,但它会给我带来错误。期待社区的帮助

@tf.keras.utils.register_keras_serializable(package='Custom', name='esgd')
def esgd(w, wt, mu):
    delta = tf.math.square(tf.norm(w-wt))
    rl = (mu/2)*delta
    return rl

def model(w, wt, mu):
    model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(32,(3,3), padding='same', activation='relu',input_shape=(28, 28, 1)),
                                tf.keras.layers.MaxPooling2D(2,2),
                                tf.keras.layers.Conv2D(64,(3,3), padding='same', activation='relu'),
                                tf.keras.layers.MaxPooling2D(2,2),
                                tf.keras.layers.Dropout(0.25),
                                tf.keras.layers.Flatten(),
                                tf.keras.layers.Dense(128,activation='relu',  kernel_initializer='ones',kernel_regularizer=esgd(w[0][7],wt[0][7],mu)
),
                                tf.keras.layers.Dropout(0.25),
                                tf.keras.layers.Dense(10, activation='softmax')
                               ])
    return model
-----错误-------

-->59模型=初始模型(w、wt、mu)
60
61#模型.设置#权重(wei[0])
在init_模型中(w,wt,mu)
11 tf.keras.层压降(0.25),
12 tf.keras.layers.Flatten(),
--->13 tf.keras.layers.density(128,activation='relu',kernel\u initializer='ones',kernel\u regulator=esgd(w[0][7],wt[0][7],mu)
14 ),
15 tf.keras.层漏失(0.25),
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/layers/core.py in_uu___init___(自我、单位、激活、使用偏差、内核初始值、偏差初始值、内核正则值、偏差正则值、活动正则值、内核约束、偏差约束、偏差约束、**kwargs)
1137 self.kernel\u initializer=initializers.get(kernel\u initializer)
1138 self.bias\u初始值设定项=初始值设定项.get(bias\u初始值设定项)
->1139 self.kernel\u正则化器=正则化器.get(kernel\u正则化器)
1140 self.bias\u正则化器=正则化器.get(bias\u正则化器)
1141 self.kernel\u constraint=constraints.get(kernel\u constraint)
/get(标识符)中的usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/regularizers.py
313返回标识符
314其他:
-->315 raise VALUERROR('无法解释正则化器标识符:',标识符)
ValueError:(“无法解释正则化器标识符:”,)
根据,如果希望正则化器在层的权重张量之外获取其他参数,则必须将tensorflow.keras.Regulationers.Regulationizer子类化

而且看起来您正在尝试支持序列化,所以不要忘记添加
get\u config
方法

from tensorflow.keras import regularizers

@tf.keras.utils.register_keras_serializable(package='Custom', name='esgd')
class ESGD(regularizers.Regularizer):

    def __init__(self, mu):
        self.mu = mu

    def __call__(self, w):
        return (mu/2) * tf.math.square(tf.norm(w - tf.transpose(w)))

    def get_config(self):
        return {'mu': self.mu}
然后你就可以用它了

tf.keras.layers.Dense(128, activation='relu', kernel_initializer='ones', kernel_regularizer=ESGD(mu=mu))
tf.keras.layers.Dense(128, activation='relu', kernel_initializer='ones', kernel_regularizer=ESGD(mu=mu))