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

运行RaGAN代码触发Keras无法将符号输入输出转为numpy数组报错如何解决

错误原因

你遇到的报错是由两个问题共同导致的:

  • 损失函数中冗余的isinstance(Real_Fake_relativistic_average_out, np.ndarray)判断,会尝试将Keras构造阶段的符号张量转换为numpy数组完成类型校验,这个操作在计算图构造阶段是不被支持的,且你写的if和else分支逻辑完全一致,该判断没有实际作用。
  • 损失函数直接捕获了外部定义的Real_Fake_relativistic_average_out、Fake_Real_relativistic_average_out两个符号张量,TensorFlow 2.x编译模型时无法追踪这两个张量的计算链路,会触发类型转换异常。

修复后的代码

import tensorflow as tf
from tensorflow.keras import Input, Model
import tensorflow.keras.backend as K

def get_ragan_network(generator,discriminator,optimizer, image_shape):
    imgs_hr = Input(image_shape)
    generated_hr = Input(image_shape)

    Discriminator_real_out = discriminator(imgs_hr)
    Discriminator_fake_out = discriminator(generated_hr)
    # 拼接两个判别输出作为模型整体输出,传入损失函数计算
    concat_disc_out = tf.concat([Discriminator_real_out, Discriminator_fake_out], axis=-1)

    epsilon = 1e-6
    def relativistic_discriminator_loss(y_true, y_pred):
        # 从拼接的输出中拆分真实、生成样本的判别结果
        real_out, fake_out = tf.split(y_pred, num_or_size_splits=2, axis=-1)
        # 相对论平均计算移到损失函数内部,确保TF可以追踪计算链路
        real_rel = real_out - K.mean(fake_out, axis=0)
        fake_rel = fake_out - K.mean(real_out, axis=0)
        return -(K.mean(K.log(K.sigmoid(real_rel) + epsilon), axis=0) + \
               K.mean(K.log(1 - K.sigmoid(fake_rel) + epsilon), axis=0))

    model = Model([generated_hr, imgs_hr], concat_disc_out)
    model.compile(optimizer=optimizer, loss=relativistic_discriminator_loss)
    return model

适配优化建议

  • TensorFlow 2.6版本下可将K.sigmoid替换为tf.sigmoid、K.mean替换为tf.reduce_mean,避免后端接口适配问题。
  • 训练时传入的y_true可直接使用形状与concat_disc_out一致的全零占位张量即可,损失函数内部已完成相对论损失的逻辑计算,不需要额外标签。

内容的提问来源于stack exchange,提问作者José Marqueses Saxo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:54:03