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

Keras训练VAE时history.validation_data为None的问题及解决方法

VAE训练后history.validation_data返回None的原因与解决方法

问题重现

尝试在CIFAR-10数据集上训练变分自编码器(VAE),脚本片段如下:

# Load the CIFAR-10 dataset
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()

# Split the data into training, validation, and test sets
validation_size = 0.2  
x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=validation_size)

# Define the model
vae = VAE(encoder, decoder)
vae.compile(optimizer=Adam())
history = vae.fit(x_train, epochs=2, batch_size=128, validation_data=(x_val, y_val))

访问history.validation_data时返回None,即history.validation_data is None结果为True。

原因分析

  1. Keras History对象的默认行为:TensorFlow/Keras的History对象默认不会存储完整的验证数据集,validation_data属性仅在特定配置下才会被赋值,新版本TensorFlow中已移除了return_validation_data参数,因此直接访问该属性会得到None。
  2. VAE训练的参数冗余:VAE作为自编码器,训练时目标数据与输入数据一致,fit方法中传入y_val是多余的,不过这并非导致validation_data为None的直接原因。

解决方法

方法1:自定义回调保存验证数据

通过自定义回调函数在训练过程中保存验证数据:

from tensorflow.keras.callbacks import Callback

class ValidationDataSaver(Callback):
    def on_train_begin(self, logs=None):
        self.val_data = self.validation_data

# 初始化回调
val_saver = ValidationDataSaver()

# VAE训练无需传入y_val,验证数据只需传入x_val
history = vae.fit(
    x_train, 
    epochs=2, 
    batch_size=128, 
    validation_data=(x_val,), 
    callbacks=[val_saver]
)

# 从回调对象中获取验证数据
saved_val_data = val_saver.val_data

方法2:手动评估验证集获取指标

如果仅需要验证集的损失/指标,无需保存完整数据,直接调用evaluate方法:

# 评估验证集
val_loss = vae.evaluate(x_val, batch_size=128)
print(f"验证集损失: {val_loss}")

方法3:适配旧版本Keras(仅适用于独立Keras)

若使用TensorFlow 2.x之前的独立Keras库,可在fit时添加return_validation_data=True参数(新版本已移除):

history = vae.fit(
    x_train, 
    epochs=2, 
    batch_size=128, 
    validation_data=(x_val,), 
    return_validation_data=True
)
# 此时history.validation_data会被赋值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:05:03