基于多层权重的正则化实现及卷积层部分权重冻结方案咨询
我不知道该方案是否可行,特此咨询。以下是我模型的简化架构:
Layer (type) Output Shape Param #Connected to ========================================== input_1 (InputLayer) [(None, 7, 7, 1024) 0 conv (Conv2D) (None, 7, 7, 10) 10240 input_1[0][0]
其中conv层的10个滤波器均为1×1×1024卷积滤波器(无偏置,与本次问题无关)。我目前对conv层使用自定义正则化函数,约束尺寸为(1×1)×1024×10的滤波器权重矩阵满足所有向量两两正交的特性,当前运行正常。
现在我需要禁用这10个滤波器中部分的训练,我已知的唯一实现方式是将10个滤波器拆分独立实现,架构如下:
Layer (type) Output Shape Param # Connected to ========================================================= input_1 (InputLayer) [(None, 7, 7, 1024) 0 conv_1 (Conv2D) (None, 7, 7, 1) 1024 input_1[0][0] conv_2 (Conv2D) (None, 7, 7, 1) 1024 input_1[0][0] conv_3 (Conv2D) (None, 7, 7, 1) 1024 input_1[0][0] ... conv_10 (Conv2D) (None, 7, 7, 1) 1024 input_1[0][0]
拆分后通过Concatenate层拼接输出,即可按需设置每个conv_i层的trainable参数为True/False。但该方案下我无法实现需要同时基于所有conv_i层权重计算的正则化函数。
请问有没有实现该正则化函数的技巧?或是有没有方法可以直接冻结单个卷积层的部分权重?
解决方案
供感兴趣的用户参考,以下是可运行的实现代码:
class SpecialRegularization(tf.keras.Model): """ 为了避免模型保存时出现警告,采用继承tf.keras.Model而非Layer的实现方式 """ def __init__(self,nfilters,**kwargs): super().__init__(**kwargs) self.inner_layers=[Conv2D(1,(1,1)) for _ in range(nfilters)] def call(self, inputs): outputs=[l(inputs) for l in self.inner_layers] self.add_loss(self.define_your_regularization_here()) return tf.concat(outputs,-1) def set_trainable_parts(self, trainables): """ 为每个滤波器独立设置trainable属性 """ for l,t in zip(self.inner_layers,trainables): l.trainable = t def define_your_regularization_here(self): # 重构原始卷积核 large_kernel=tf.concat([l.kernel for l in self.inner_layers],-1) return tf.reduce_sum(large_kernel*large_kernel[:,:,:,::-1])
内容的提问来源于stack exchange,提问作者Romain Xu-Darme
相关产品推荐
相关产品推荐

