如何在Keras中引用多输出生成器模型的单个输出?
解决多输出生成器在GAN中引用第二个输出的TypeError问题
嘿,我之前在构建多输出GAN的时候也碰到过这个坑!咱们来一步步搞定这个问题。
问题根源
你遇到的TypeError: unsupported callable,本质是在Keras计算图构建过程中,直接用fake[1]取生成器第二个输出时,没正确拿到张量对象,或者判别器的输入形状和生成器输出不匹配,导致无法正常调用判别器。
正确解决方法
方法1:直接通过输出列表索引获取(最直接)
先确认生成器确实返回两个输出张量,然后在构建GAN时先存下所有输出,再取第二个传递给判别器:
gan_input = Input(shape=(100,50), dtype='float32') # 先获取生成器的所有输出(是一个张量列表) gen_outputs = generator(gan_input) # 取第二个输出张量传递给判别器 gan_output = discriminator(gen_outputs[1])
如果这样还是报错,大概率是判别器输入形状和生成器第二个输出形状不匹配。你可以先打印生成器第二个输出的形状确认:
print(generator.outputs[1].shape)
比如你的生成器里dense_2是Dense(2),输入是(100,50),经过前面的层后,dense_2的形状应该是(None, 2),那判别器的输入必须定义为Input(shape=(2,)),否则会出现形状兼容错误。
方法2:给生成器输出命名,通过名称获取(更清晰,适合复杂模型)
给生成器的第二个输出层加个名字,之后通过名称直接获取输出张量,避免索引出错:
# 修改生成器定义,给第二个输出层命名 input = Input(shape=(100,50), dtype='float32') drop_1 = Dropout(0.3, name='drop_1')(input) dense_1 = Dense(20, activation='relu')(drop_1) # 给第二个输出层加名称 dense_2 = Dense(2, name='gan_feature_output')(dense_1) flatten_1 = Flatten()(dense_2) preds = Dense(7, activation='softmax', name='class_prediction')(flatten_1) generator = Model(inputs=input, outputs=[preds, dense_2]) generator.compile(loss=['categorical_crossentropy', None], optimizer='adam', metrics=['acc'])
然后构建GAN时,通过名称获取输出:
gan_input = Input(shape=(100,50), dtype='float32') # 调用生成器后,通过名称取第二个输出 gen_outputs = generator(gan_input) feature_output = gen_outputs['gan_feature_output'] # 传递给判别器 gan_output = discriminator(feature_output)
这种方式不仅代码可读性更高,还能避免因为调整输出顺序导致的索引错误。
额外检查点
- 确认判别器的输入形状和生成器第二个输出的形状完全匹配(忽略batch维度)
- 确保生成器在编译和调用前没有被意外修改结构,比如冻结层或者改动了输出层
内容的提问来源于stack exchange,提问作者Lina Fischer
相关产品推荐
相关产品推荐

