能否在Keras中创建含额外参数的自定义正则化项?
自定义Keras正则化项的正确实现方式
当然可以创建这类自定义正则化项!不过你当前的写法有个小问题——Keras的正则化器接口默认只接受权重矩阵这一个输入参数,而你的customized_regularizer还需要parameterA和parameterB两个额外参数,直接作为kernel_regularizer传入会触发参数不匹配的错误。
下面给你两种可行的修复方案,按需选择:
方法1:用闭包包装参数(简洁首选)
通过闭包把额外参数“封装”进去,返回一个符合Keras要求的、仅接收权重矩阵的函数:
import keras.backend as K from keras.layers import Dense def customized_regularizer(parameterA, parameterB): def regularizer(weight_matrix): # 确保计算结果是标量损失张量,你的sum操作已经满足要求 return K.sum(K.dot(parameterA, weight_matrix) - parameterB) return regularizer # 使用时先传入自定义参数,得到符合接口要求的正则化器 model.add(Dense(64, input_dim=64, kernel_regularizer=customized_regularizer(your_paramA, your_paramB)))
方法2:继承Regularizer类(适合复杂场景)
如果需要支持模型保存/加载时保留正则化器参数,或者有更复杂的逻辑,可以继承Keras内置的Regularizer类:
import keras.backend as K from keras.layers import Dense from keras.regularizers import Regularizer class CustomRegularizer(Regularizer): def __init__(self, parameterA, parameterB): # 把参数转为Keras张量,确保计算兼容 self.parameterA = K.constant(parameterA) self.parameterB = K.constant(parameterB) def __call__(self, weight_matrix): return K.sum(K.dot(self.parameterA, weight_matrix) - self.parameterB) # 可选:实现get_config方法,让模型保存时能记录正则化器参数 def get_config(self): return { 'parameterA': self.parameterA.numpy(), 'parameterB': self.parameterB.numpy() } # 使用方式 model.add(Dense(64, input_dim=64, kernel_regularizer=CustomRegularizer(your_paramA, your_paramB)))
额外提醒
- 要确保
parameterA和parameterB的维度与权重矩阵匹配,避免K.dot()出现维度不兼容的错误; - 正则化项的返回值必须是标量张量,你的
K.sum()操作已经满足这个要求,无需额外调整。
内容的提问来源于stack exchange,提问作者Deli Bajraktari
相关产品推荐
相关产品推荐

