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_
相关产品推荐
相关产品推荐

