超分辨率GAN输入输出映射及HR图像在联合模型中的作用疑问
SRGAN联合模型中HR图像输入的作用疑问
我在研究超分辨率GAN(SRGAN)的代码时,产生了一个困惑:高分辨率(HR)图像对应到哪个模型,以及为什么要把它作为联合模型的输入?
下面是相关的核心代码片段:
# Build and compile the discriminator self.discriminator = self.build_discriminator() self.discriminator.compile(loss='mse', optimizer=optimizer, metrics=['accuracy']) # Build the generator self.generator = self.build_generator() # High res. and low res. images img_hr = Input(shape=self.hr_shape, name="HR") img_lr = Input(shape=self.lr_shape, name="LR") # Generate high res. version from low res. fake_hr = self.generator(img_lr) # Extract image features of the generated img fake_features = self.vgg(fake_hr) # For the combined model we will only train the generator self.discriminator.trainable = False # Discriminator determines validity of generated high res. images validity = self.discriminator(fake_hr) self.combined = Model([img_lr, img_hr], [validity, fake_features]) self.combined.compile(loss=['binary_crossentropy', 'mse'], loss_weights=[1e-3, 1], optimizer=optimizer)
打印联合模型摘要后,发现HR层没有连接到任何其他模型:
Layer (type) Output Shape Param # Connected to ================================================================================================== LR (InputLayer) [(None, 64, 64, 3)] 0 __________________________________________________________________________________________________ Generator (Functional) (None, 256, 256, 3) 27470659 LR[0][0] __________________________________________________________________________________________________ HR (InputLayer) [(None, 256, 256, 3) 0 __________________________________________________________________________________________________ Discriminator (Functional) (None, 16, 16, 1) 5219137 Generator[0][0] __________________________________________________________________________________________________ VGG19 (Functional) (None, 64, 64, 256) 1735488 Generator[0][0] ================================================================================================== Total params: 34,425,284 Trainable params: 27,466,435 Non-trainable params: 6,958,849
数据流看起来是:LR -> Generator -> Discriminator -> validity;LR -> Generator -> VGG19 -> fake_features。那在语句self.combined = Model([img_lr, img_hr], [validity, fake_features])中,img_hr到底有什么作用呢?
解答
这其实是Keras构建模型时的一个实用小技巧,img_hr在这里的核心作用是对齐训练数据的输入格式,为损失计算提供真实目标的数据源,而非直接参与前向传播计算,具体来说:
- 匹配训练数据的输入结构
训练SRGAN时,我们的训练样本都是成对存在的:低分辨率图(LR)和对应的真实高分辨率图(HR)。当用model.fit()训练联合模型时,我们需要把输入数据组织成[lr_batch, hr_batch]的形式,输出目标则是判别器的真假标签、以及真实HR图的VGG特征。
如果联合模型的输入只定义img_lr,那训练时传入的成对数据就会和模型输入结构不匹配,必须把img_hr作为输入占位符加进去,才能让Keras正确解析我们的训练数据集。
- 为VGG特征损失提供真实基准
虽然在模型前向传播的数据流里,img_hr没有连接到任何层,但计算感知损失(也就是VGG特征的MSE损失)时,我们需要用真实HR图像的VGG特征作为生成图特征的目标值。把img_hr加入模型输入,是为了在训练时能方便地传入真实HR图,进而计算出对应的真实特征,作为损失计算的ground truth。
你去看训练循环的代码就能发现,一定会有提取真实HR图VGG特征的逻辑,而模型输入里保留img_hr,就是为了让整个输入-输出的结构对应起来,让Keras的训练流程顺畅运行。
- 让代码逻辑更直观
把img_hr作为联合模型的输入之一,能更清晰地体现SRGAN的核心逻辑:模型基于LR图生成HR图,同时参考真实HR图来优化生成效果。即使它不参与前向计算,也能让代码的可读性更强,让阅读者一眼就明白训练数据是成对的LR-HR样本。
简单总结:img_hr是一个「输入占位符」,它不参与模型的前向计算,但负责对齐训练数据格式、为特征损失提供真实目标,是让整个训练流程正常运转的必要环节。
内容的提问来源于stack exchange,提问作者Begoodpy
相关产品推荐
相关产品推荐

