具有 1100 万个参数的卷积神经网络无法在 100 个图像样本上过拟合

数据挖掘 机器学习 Python 喀拉斯 美国有线电视新闻网 过拟合
2022-01-20 23:00:25

我一直在尝试对灰度图像进行某种图像增强。我同时使用了像素损失和感知损失(感知损失使用在同一数据集上训练的两个类之间的分类器)。

所以我的网络的输入是一个坏的图像,输出是图像边缘更清晰的增强图像。

我已经在 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 算子来获得一个掩码,该掩码乘以输入图像和目标图像之间的差异,从而使像素损失对模型在应该完成图像中不完整线条的像素上进行惩罚。网络将专注于完成不完整的边缘左右,但没有任何改变。

1个回答

您在最后一层使用 sigmoid 激活,这将您可能的输出限制在 0 和 1 之间。这通常用于二进制分类,但似乎您根本没有进行分类。如果您的图像的值限制在 0-1 范围内,那么这可能很好。否则,这可能是您的问题的根源。

我建议在最后的卷积中移除 sigmoid 激活,让它不激活。