为什么以及如何从 SRGAN 中的神经网络 [-1,1] 生成输出图像的范围?
Why and How to make range of Output image from a Neural Network [-1,1] in SRGAN?
我一直致力于使用生成对抗网络 (SRGAN) 重新实现逼真的单图像超分辨率,现在我只能使用第 3.2 节中的给定信息。 基于论文中,目标 HR 应在 [-1,1] 范围内,输入 LR 应在 [0,1] 范围内,并且 MSE 损失是在 [-1,1].[=13 范围内的图像上计算的=]
最后一句暗示生成器网络的输出应该在[-1,1]。这样 content_loss = MSELoss(generator(output), target).我理解正确吗?但是当我打印我的生成器网络的输出时,它的 laster 只是一个 conv2d,它给我的图像在愤怒 [0,1].
我在 运行 SRResNet-MSE 部分没有得到好的结果,我想可能是因为 MSE 损失是在不同的范围内计算的,而不仅仅是一个 [-1,1]?
但是,如果我仍然想遵循论文的架构(最后一层是 conv2d),我的生成器的输出怎么可能在 [-1,1] 范围内呢?
我还包括我的代码Class生成器
class Generator(nn.Module):
def __init__(self, scale_factor):
upsample_block_num = int(math.log(scale_factor, 2))
super(Generator, self).__init__()
self.block1 = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=9, stride=1, padding=4, bias=False),
nn.LeakyReLU(0.2, inplace=True)
)
self.block2 = self.make_layer(ResidualBlock, 16)
self.block3 = nn.Sequential(
nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1, bias=False),
nn.InstanceNorm2d(64, affine=True)
)
block4 = [UpsampleBLock(64, 2) for _ in range(upsample_block_num)]
block4.append(nn.Conv2d(64, 3, kernel_size=9, stride=1, padding=4, bias=False))
self.block4 = nn.Sequential(*block4)
def make_layer(self, block, num_of_layer):
layers = []
for _ in range(num_of_layer):
layers.append(block(64))
return nn.Sequential(*layers)
def forward(self, x):
block1 = self.block1(x)
block2 = self.block2(block1)
block3 = self.block3(block2)
block4 = self.block4(block1 + block3)
return block4
非常感谢您的帮助!
鉴于您希望在 [-1,1] 范围内输出,而目前您只是在 [0,1] 范围内获得输出。
output = (output*2)-1
应该完成这项工作。
我一直致力于使用生成对抗网络 (SRGAN) 重新实现逼真的单图像超分辨率,现在我只能使用第 3.2 节中的给定信息。 最后一句暗示生成器网络的输出应该在[-1,1]。这样 content_loss = MSELoss(generator(output), target).我理解正确吗?但是当我打印我的生成器网络的输出时,它的 laster 只是一个 conv2d,它给我的图像在愤怒 [0,1]. 我在 运行 SRResNet-MSE 部分没有得到好的结果,我想可能是因为 MSE 损失是在不同的范围内计算的,而不仅仅是一个 [-1,1]? 但是,如果我仍然想遵循论文的架构(最后一层是 conv2d),我的生成器的输出怎么可能在 [-1,1] 范围内呢? 我还包括我的代码Class生成器 非常感谢您的帮助!class Generator(nn.Module):
def __init__(self, scale_factor):
upsample_block_num = int(math.log(scale_factor, 2))
super(Generator, self).__init__()
self.block1 = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=9, stride=1, padding=4, bias=False),
nn.LeakyReLU(0.2, inplace=True)
)
self.block2 = self.make_layer(ResidualBlock, 16)
self.block3 = nn.Sequential(
nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1, bias=False),
nn.InstanceNorm2d(64, affine=True)
)
block4 = [UpsampleBLock(64, 2) for _ in range(upsample_block_num)]
block4.append(nn.Conv2d(64, 3, kernel_size=9, stride=1, padding=4, bias=False))
self.block4 = nn.Sequential(*block4)
def make_layer(self, block, num_of_layer):
layers = []
for _ in range(num_of_layer):
layers.append(block(64))
return nn.Sequential(*layers)
def forward(self, x):
block1 = self.block1(x)
block2 = self.block2(block1)
block3 = self.block3(block2)
block4 = self.block4(block1 + block3)
return block4
鉴于您希望在 [-1,1] 范围内输出,而目前您只是在 [0,1] 范围内获得输出。
output = (output*2)-1
应该完成这项工作。