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

GridSearchCV调优VAE时已编译仍报未编译错误的求助

问题原因分析
  1. GridSearchCV克隆模型导致未编译:GridSearchCV在交叉验证时会克隆传入的VAE实例,克隆后的新实例不会保留原实例的编译状态,训练时就会抛出未编译的错误。
  2. epochs参数传递错误:epochs是模型fit方法的参数,而非VAE类的初始化参数,直接放入param_grid无效——GridSearchCV会把param_grid的参数传递给模型的__init__方法,而非fit方法。
  3. 数据未匹配输入要求:加载的MNIST数据是(28,28)的灰度图,未归一化且缺少通道维度,和Encoder定义的输入形状(28,28,1)不匹配,会引发后续输入错误。
解决方案

步骤1:修改VAE类适配GridSearchCV

重写VAE类,确保克隆后的实例自动完成编译,同时将epochs设为初始化参数,让GridSearchCV能通过param_grid传递:

class VAE(keras.Model, BaseEstimator):
    def __init__(self, encoder, decoder, optimizer=Adam(), epochs=10, **kwargs):
        super().__init__(**kwargs)
        self.encoder = encoder
        self.decoder = decoder
        self.epochs = epochs
        self.optimizer = optimizer
        self.total_loss_tracker = keras.metrics.Mean(name="total_loss")
        self.reconstruction_loss_tracker = keras.metrics.Mean(name="reconstruction_loss")
        self.kl_loss_tracker = keras.metrics.Mean(name="kl_loss")
        # 初始化时自动编译
        self.compile(optimizer=self.optimizer)

    # 保留原有的call、train_step、test_step、metrics方法不变

    def fit(self, X, y=None, batch_size=32, **kwargs):
        # 兼容克隆实例,确保编译状态
        if not hasattr(self, 'optimizer') or self.optimizer is None:
            self.compile(optimizer=self.optimizer)
        # 使用类初始化的epochs参数
        return super().fit(X, y=y, batch_size=batch_size, epochs=self.epochs, **kwargs)

步骤2:预处理MNIST数据

对数据做归一化和通道维度扩展,匹配模型输入要求:

import numpy as np

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# 归一化到0-1区间
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
# 添加通道维度
x_train = np.expand_dims(x_train, axis=-1)
x_test = np.expand_dims(x_test, axis=-1)

步骤3:调整GridSearchCV配置

修正scoring函数(自编码器需基于重构误差,转换为GridSearchCV默认的最大化分数逻辑),并传入正确的训练数据:

latent_dimension = 25
encoder = Encoder(latent_dimension, (28, 28, 1))
decoder = Decoder()
vae = VAE(encoder, decoder, optimizer=Adam())

param_grid = {'epochs': [10, 20, 30]}

# 自定义scoring函数:重构误差越小越好,取负转为最大化问题
def vae_scoring(estimator, X):
    reconstructions = estimator.predict(X)
    return -mean_absolute_error(X.flatten(), reconstructions.flatten())

grid = GridSearchCV(vae, param_grid, scoring=vae_scoring, cv=2)
# 自编码器训练无需标签,仅传入x_train
grid.fit(x_train)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:35:57