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

如何在Keras Tuner中为对称自编码器添加第一层单元数≥第二层的约束

Keras-Tuner实现自编码器隐藏层单元数约束(第一层≥第二层)

要实现第一层隐藏层单元数units_0≥第二层units_1的约束,核心是在定义units_1时根据units_0的选择动态限制其候选范围,避免生成无效的超参数组合。以下是修改后的完整代码:

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

class DAE(tf.keras.Model):
    '''
    去噪自编码器模型
    '''

    def __init__(self, hp, **kwargs):
        '''
        模型初始化
        args :
            hp  : Keras-Tuner超参数调优器
        return:
            None
        '''
        super(DAE, self).__init__(**kwargs)
        input_dim = 15
        latent_dim = hp.Choice("latent_space", [2,4,8])
        
        # 定义第一层隐藏层单元数候选
        units_0 = hp.Choice("units_0", [8, 16, 32, 64])
        
        # 根据units_0的取值,动态限定units_1的候选范围(满足units_1 ≤ units_0)
        if units_0 == 8:
            units_1 = hp.Choice("units_1", [8])
        elif units_0 == 16:
            units_1 = hp.Choice("units_1", [8, 16])
        elif units_0 == 32:
            units_1 = hp.Choice("units_1", [8, 16, 32])
        elif units_0 == 64:
            units_1 = hp.Choice("units_1", [8, 16, 32, 64])
        
        dropout = hp.Choice("dropout_rate", [0.1, 0.2, 0.3, 0.4, 0.5])

        # 构建编码器
        inputs    = tf.keras.Input(shape = (input_dim,))
        x         = layers.Dense(units_0, activation="relu")(inputs)
        x         = layers.Dropout(dropout)(x)
        x         = layers.Dense(units_1, activation="relu")(x)
        x         = layers.Dropout(dropout)(x)
        z         = layers.Dense(latent_dim)(x)
        self.encoder = tf.keras.Model(inputs, z, name="encoder")
        
        # 构建对称解码器
        inputs  = tf.keras.Input(shape=(latent_dim,))
        x       = layers.Dense(units_1, activation="relu")(inputs)
        x       = layers.Dropout(dropout)(x)
        x       = layers.Dense(units_0, activation="relu")(x)
        x       = layers.Dropout(dropout)(x)
        outputs = layers.Dense(input_dim, activation="linear")(x)
        self.decoder = tf.keras.Model(inputs, outputs, name="decoder")
    
    def call(self, inputs):
        # 实现模型前向传播逻辑(Keras模型必须实现的核心方法)
        z = self.encoder(inputs)
        reconstructed = self.decoder(z)
        return reconstructed

关键说明:

  • 约束逻辑:通过判断units_0的当前取值,直接为units_1筛选出符合units_1 ≤ units_0的候选值,Keras-Tuner在调参时只会生成有效的超参数组合。
  • 对称结构保持:解码器的层单元数与编码器完全对应,确保自编码器的对称结构要求。
  • 补充call方法:原代码缺少模型前向传播的核心逻辑,这里补充后才能让模型正常训练和推理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:55:34