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

TensorFlow绑定编解码器权重时自定义DenseTranspose层触发TypeError

问题解决

错误原因

自定义的DenseTranspose类未继承tensorflow.keras.layers.Layer基类,不符合Keras对自定义层的要求,因此Sequential模型在添加层时判定其不是合法的层实例,触发类型错误。

修复代码

只需要修改自定义层的继承声明即可,补充可选的get_config方法保证模型可以正常序列化保存:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# 修复:继承layers.Layer基类
class DenseTranspose(layers.Layer):
  def __init__(self, dense, activation=None, **kwargs):
    self.dense = dense
    self.act_ = keras.activations.get(activation)
    super().__init__(**kwargs)

  def build(self, batch_input_shape):
    self.biases = self.add_weight(name="bias", initializer="zeros", shape=[self.dense.input_shape[-1]])
    super().build(batch_input_shape)

  def call(self, inputs):
    z = tf.matmul(inputs, self.dense.weights[0], transpose_b=True)
    return self.act_(z + self.biases)

  # 可选:补充该方法支持模型序列化/保存
  def get_config(self):
    base_config = super().get_config()
    base_config.update({
        "dense": self.dense,
        "activation": keras.activations.serialize(self.act_)
    })
    return base_config

# 以下原有代码无需改动
dense_1 = layers.Dense(100, activation="selu")
dense_2 = layers.Dense(30, activation="selu")
tied_encoder = keras.models.Sequential([
                           layers.Flatten(input_shape=[28,28]),
                           dense_1,
                           dense_2
])
tied_decoder = keras.models.Sequential([
                            DenseTranspose(dense_2, activation="selu"),
                            DenseTranspose(dense_1, activation="sigmoid"),
                            keras.layers.Reshape([28,28])
])

# 注意:原有代码中的rounded_accuracy需要提前定义,示例定义如下
rounded_accuracy = keras.metrics.BinaryAccuracy(threshold=0.5)

tied_ae = keras.models.Sequential([tied_encoder, tied_decoder])
tied_ae.compile(loss="binary_crossentropy", optimizer=keras.optimizers.SGD(learning_rate=1.5), metrics=[rounded_accuracy])

# 运行前确保X_train、X_valid已经归一化到[0,1]区间,形状为(N, 28, 28)
# history = tied_ae.fit(X_train, X_train, epochs=10, validation_data=(X_valid, X_valid))

注意事项

  • 代码中用到的rounded_accuracy需要提前定义,上述代码已经补充了常用的二分类准确率实现
  • 输入的MNIST数据X_train、X_valid需要提前归一化到0~1区间,形状匹配(样本数, 28, 28)即可正常运行

内容的提问来源于stack exchange,提问作者Coder_ yug_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:45:03