如何创建含可训练权重的Keras层?附自定义层及修复方案
自定义Keras层Build方法的修复方案
我来帮你搞定这个自定义Keras层的问题~先看看你提供的代码片段,里面有几个小问题需要修正,下面是具体的修复步骤和完整代码:
原始代码的问题点
你写的代码里有两处关键问题:
RandomNormal初始化器的参数拼写错误:stdd...应该是stddev,这是Keras里指定正态分布标准差的标准参数名;- 自定义层的
build方法没有调用父类的build方法,这会导致Keras无法正确完成层的初始化流程。
修复后的完整代码
from tensorflow.keras.layers import Layer from tensorflow.keras.initializers import RandomNormal class Multed_Weights(Layer): def __init__(self, input_dim, output_dim, **kwargs): self.output_dim = output_dim self.input_dim = input_dim super(Multed_Weights, self).__init__(**kwargs) def build(self, input_shape): # 为该层创建可训练权重变量 self.kernel = self.add_weight( name='kernel', shape=(self.input_dim, self.output_dim), initializer=RandomNormal(mean=0., stddev=0.01), # 修正拼写错误,补充合理的标准差数值 trainable=True # 显式声明权重可训练,默认也是True,加上更清晰 ) super(Multed_Weights, self).build(input_shape) # 调用父类build方法完成初始化 def call(self, inputs): # 实现层的前向传播逻辑,这里给出矩阵乘法示例,可按需修改 return inputs @ self.kernel
修复细节说明
- 修正初始化器参数:把截断的
stdd...改成正确的stddev,并给了一个常用的标准差0.01,你可以根据自己的模型需求调整这个数值; - 添加父类build调用:这一步很重要,Keras需要通过父类的build方法来确认层已经完成权重初始化,避免后续使用时抛出未构建的错误;
- 补充call方法:自定义Keras层必须实现
call方法来定义前向计算逻辑,这里写了最基础的矩阵乘法,你可以换成自己需要的运算逻辑; - 显式声明trainable:虽然默认就是可训练状态,但写出来能让代码更清晰,明确这个权重会参与模型训练。
内容的提问来源于stack exchange,提问作者Sean Paulsen
相关产品推荐
相关产品推荐

