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

无法访问TensorFlow子类化模型中MyLayer自定义层的权重问题

问题分析与解决方案

问题根源

  1. 你的model是普通Python类而非TensorFlow官方的子类化模型(未继承tf.keras.Model),不遵循Keras的层追踪逻辑,导致自定义层无法被正确注册到最终模型中。
  2. self.encoder是从mlp_autoencoder返回的独立模型,其输出张量属于另一个模型的计算图。直接基于该张量创建MyLayer并拼接成新模型时,Keras无法自动将MyLayer纳入当前模型的层集合,因此调用get_layer('MyLayer')会报错。

快速修复方案

无需重构为标准子类化模型的前提下,可通过保存自定义层的直接引用来绕过层查找问题:

class model():
    def __init__(self, dims, size):
        self._dims = dims
        self.size = size
        self.autoencoder= None
        self.encoder = None
        self.decoder = None
        self.model = None
        self.my_layer = None  # 新增:保存自定义层引用

    def initialize(self):
        self.autoencoder, self.encoder, self.decoder = mlp_autoencoder(self.dims)
        self.my_layer = MyLayer(self.size, name= 'MyLayer')  # 实例化时保存引用
        output = self.my_layer(self.encoder.output)
    
        self.model = Model(inputs= self.autoencoder.input,
                       outputs= [self.autoencoder.output, output])

    @property
    def layer_weights(self):
        return self.my_layer.get_weights()  # 直接通过引用获取权重

规范实现方案(推荐)

将你的类改为继承tf.keras.Model的标准子类化模型,Keras会自动追踪所有层,避免层注册问题:

import tensorflow as tf
from tensorflow.keras import Model

class MyModel(tf.keras.Model):
    def __init__(self, dims, size):
        super().__init__()
        self._dims = dims
        self.size = size
        # 初始化子模型与自定义层
        self.autoencoder, self.encoder, self.decoder = mlp_autoencoder(self.dims)
        self.my_layer = MyLayer(self.size, name='MyLayer')

    def call(self, inputs):
        # 前向传播逻辑
        autoencoder_out = self.autoencoder(inputs)
        encoder_out = self.encoder(inputs)
        my_layer_out = self.my_layer(encoder_out)
        return [autoencoder_out, my_layer_out]

# 使用示例
model = MyModel(dims=[...], size=...)
model.build(input_shape=(None, ...))  # 或直接传入数据触发build

此时直接通过model.my_layer.get_weights()即可获取自定义层权重,也可通过model.get_layer('MyLayer')查找层。

补充说明

  • 避免直接修改模型的私有属性(如self.model._layers),这类属性属于TensorFlow内部实现,后续版本可能发生变化,存在兼容性风险。
  • 单独使用MyLayer时正常,是因为此时层的输入是独立张量,而非其他模型的输出,Keras能正确追踪并注册该层。

内容的提问来源于stack exchange,提问作者g herb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:01:06