运行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
相关产品推荐
相关产品推荐

