添加自定义回调后Keras条件GAN报错:判别器层未定义输入
解决Keras条件GAN自定义回调触发"The layer discriminator has never been called"错误
问题本质
你遇到的错误核心是:自定义回调中尝试访问判别器层输出时,判别器模型还未被传入符合要求的输入数据完成调用,导致它的输入形状未被初始化。条件GAN的判别器需要两个输入(图像张量+条件标签张量),如果回调里没有正确传入这两组数据,直接访问层输出就会触发该错误。
具体解决方法
1. 修正自定义回调逻辑,传入合法输入数据
不要直接访问判别器层的output属性,而是通过构建子模型+传入合规输入的方式获取层输出。比如在回调的on_epoch_end中,先生成测试用的图像和标签,再传入判别器:
import numpy as np from tensorflow import keras class DiscriminatorOutputCallback(keras.callbacks.Callback): def __init__(self, latent_dim, num_classes, num_samples=8): self.latent_dim = latent_dim self.num_classes = num_classes self.num_samples = num_samples # 预先生成测试用的潜在向量和标签 self.test_latent = np.random.normal(0, 1, (num_samples, latent_dim)) self.test_labels = keras.utils.to_categorical( np.random.randint(0, num_classes, num_samples), num_classes ) def on_epoch_end(self, epoch, logs=None): # 用生成器生成测试图像 generated_imgs = self.model.generator([self.test_latent, self.test_labels]) # 构建获取中间层输出的子模型,替换成你要可视化的层索引或名称 target_layer = self.model.discriminator.layers[2] layer_output_model = keras.Model( inputs=self.model.discriminator.input, outputs=target_layer.output ) # 传入图像+标签,获取层输出 layer_output = layer_output_model.predict([generated_imgs, self.test_labels], verbose=0) # 这里添加你的可视化逻辑(比如打印形状、绘图保存等) print(f"Epoch {epoch+1}: 判别器目标层输出形状: {layer_output.shape}")
2. 提前手动初始化判别器的输入形状
如果不想修改回调逻辑,也可以在调用cond_gan.fit()之前,手动传入一组dummy数据调用判别器,让它提前完成输入形状初始化:
# 假设你的图像是MNIST格式(28,28,1),类别数为10 dummy_imgs = np.random.rand(1, 28, 28, 1) dummy_labels = keras.utils.to_categorical([0], num_classes=10) # 手动调用判别器,触发输入形状初始化 _ = cond_gan.discriminator([dummy_imgs, dummy_labels])
关键注意事项
- 条件GAN的判别器是多输入模型,必须同时传入图像张量和条件标签张量,缺一不可。
- 未被调用过的层,其
output属性没有绑定具体的输入输出形状,Keras需要通过一次实际调用才能确定这些参数。
内容的提问来源于stack exchange,提问作者Ingeneravit
相关产品推荐
相关产品推荐

