TensorFlow2.6训练多输出GAN判别器报ListWrapper无minimize属性错误
报错原因
你在编译多输出判别器c_model时,为optimizer参数传入了列表[opt, opt],TensorFlow 2.6的Keras框架会将该列表包装为ListWrapper对象,而训练时框架需要调用优化器的minimize方法执行参数更新,ListWrapper本身没有该方法,因此触发AttributeError。
常规多输出模型如果所有输出共享同一个优化器,直接传入单个优化器实例即可,不需要封装为列表。只有需要为不同输出指定独立优化器的场景才需要传入列表/字典,且该场景在TensorFlow 2.6版本中无法通过默认的compile+train_on_batch逻辑实现,需要写自定义训练循环。
修复方案
修改c_model的编译代码,将optimizer参数改为单个优化器实例即可:
c_model = Model(inputs = in_image, outputs = [c_out_layer, d_out_layer]) opt = tf.keras.optimizers.SGD(learning_rate=0.0002) # 仅修改optimizer参数,其余配置保持不变 c_model.compile( loss=['sparse_categorical_crossentropy', 'binary_crossentropy'], optimizer=opt, metrics=['accuracy', 'accuracy'] )
额外注意事项
多输出模型调用train_on_batch返回的结果维度与单输出不同,顺序为「总损失 + 每个输出的损失 + 每个输出的指标」,你当前的返回值接收代码会触发不匹配报错,建议调整为:
# 对应返回值:总损失、分类分支损失、判别分支损失、分类分支准确率、判别分支准确率 total_loss, c_loss, d_loss, c_acc, d_acc = c_model.train_on_batch(Xsup_real, [ysup_real, label_real])
内容的提问来源于stack exchange,提问作者Arpit Kumar
相关产品推荐
相关产品推荐

