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

如何在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)

这种方式不仅代码可读性更高,还能避免因为调整输出顺序导致的索引错误。

额外检查点

  1. 确认判别器的输入形状和生成器第二个输出的形状完全匹配(忽略batch维度)
  2. 确保生成器在编译和调用前没有被意外修改结构,比如冻结层或者改动了输出层

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:12:23