我一直在尝试对灰度图像进行某种图像增强。我同时使用了像素损失和感知损失(感知损失使用在同一数据集上训练的两个类之间的分类器)。
所以我的网络的输入是一个坏的图像,输出是图像边缘更清晰的增强图像。
我已经在 keras 中编写了代码
inputs = Input(shape=image_shape)
x = Conv2D(filters=ngf, kernel_size=(7, 7), padding='same')(inputs)
x = BatchNormalization()(x)
x = LeakyReLU(0.2)(x)
n_downsampling = 2
for i in range(n_downsampling):
mult = 2**i
x = Conv2D(filters=ngf*mult*2, kernel_size=(3, 3), strides=2, padding='same')(x)
x = BatchNormalization()(x)
x = LeakyReLU(0.2)(x)
mult = 2**n_downsampling
for i in range(n_blocks_gen):
x = res_block(x, ngf*mult, use_dropout=False)
for i in range(n_downsampling):
mult = 2**(n_downsampling - i)
x = Conv2DTranspose(filters=int(ngf * mult / 2), kernel_size=(3, 3), strides=2, padding='same')(x)
x = BatchNormalization()(x)
x = LeakyReLU(0.2)(x)
#x = ReflectionPadding2D((3, 3))(x)
x = Conv2D(filters=output_nc, kernel_size=(5, 5), padding='same')(x)
x = Conv2D(filters=output_nc, kernel_size=(3, 3))(x)
x = Activation('sigmoid')(x)
outputs = Add()([x, inputs])
#outputs = Lambda(lambda z: K.clip(z, -1, 1))(x)
outputs = Lambda(lambda z: z/2)(outputs)
model = Model(inputs=inputs, outputs=outputs, name='Generator')
res_block 的函数
def res_block(input, filters, kernel_size=(3, 3), strides=(1, 1),
use_dropout=False):
"""
Instanciate a Keras Resnet Block using sequential API.
:param input: Input tensor
:param filters: Number of filters to use
:param kernel_size: Shape of the kernel for the convolution
:param strides: Shape of the strides for the convolution
:param use_dropout: Boolean value to determine the use of dropout
:return: Keras Model
"""
x = Conv2D(filters=filters,
kernel_size=kernel_size,
strides=strides,
padding='same')(input)
x = BatchNormalization()(x)
x = Activation('relu')(x)
if use_dropout:
x = Dropout(0.5)(x)
x = Conv2D(filters=filters,
kernel_size=kernel_size,
strides=strides,
padding='same')(x)
x = BatchNormalization()(x)
merged = Add()([input, x])
return merged
知道为什么这不会过拟合吗?我一直在寻找其他损失函数,但找不到太多。我个人尝试通过在增强图像上使用 sobel 算子来获得一个掩码,该掩码乘以输入图像和目标图像之间的差异,从而使像素损失对模型在应该完成图像中不完整线条的像素上进行惩罚。网络将专注于完成不完整的边缘左右,但没有任何改变。