You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建含可训练权重的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:32:32