0
vgg19_net = VGG19(input_shape = (200,200,3), include_top = False, weights = 'imagenet')

model_vgg19 = Sequential()
model_vgg19.add(vgg19_net)

model_vgg19.add(Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_uniform'))
model_vgg19.add(BatchNormalization())

model_vgg19.add(Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_uniform'))
model_vgg19.add(BatchNormalization()) 

model_vgg19.add(Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_uniform'))
model_vgg19.add(BatchNormalization())
model_vgg19.add(MaxPooling2D())

model_vgg19.add(Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_uniform'))
model_vgg19.add(BatchNormalization())
model_vgg19.add(MaxPooling2D())

model_vgg19.add(Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_uniform'))
model_vgg19.add(BatchNormalization()) 


model_vgg19.add(Flatten())
model_vgg19.add(Dense(128, activation = 'relu', kernel_initializer = 'he_uniform'))
model_vgg19.add(Dense(1, activation = 'sigmoid'))

model_vgg19.compile(loss='binary_crossentropy',optimizer=Adam(lr=1e-5), metrics=['accuracy'])
model_vgg19.summary()

以上是我的 python 代码,其中我试图将层添加到预训练的 VGG19 模型中。我有一个真实面孔和虚假面孔的数据集,这是一个分类问题。我已经对所有图像的像素值(0 到 1 之间)进行了标准化,我使用 80% 作为训练数据,20% 作为验证数据。我目前在验证上的准确度为 95-96%,但在我的测试集上,我的准确度只有 91-92% 左右。我是 DL 新手,仍在学习如何预处理人脸图像和构建有效模型。如果您在我的 VGG19 实现中发现任何异常,请告诉我。我也使用了图像增强,但它并没有被证明是有用的。请让我知道如何使这个问题变得更好,因为我是 SO 新手。另外,数据集是机密的,所以我不能分享。对不起!

4

1 回答 1

1

我在您的代码中没有看到任何问题。为了改进这一点:- 您可以添加 Dropout 以减少OverFitting,您也可以尝试使用 ResNet 或 EfficientNet 版本(在 FakeFace 检测方面比 VGG 更好);最重要的是,您可以玩弄超参数;你的LR很低;尝试增加它。如果你想要先进的技术,你可以尝试多个输出或使用图像分割(它不太可能帮助提高你的准确性,但多个输出可能)。

PS 我最近研究了一个类似的数据集,并设法在测试集上获得了 98% 的准确率。(我用过EffNetB2

于 2021-12-06T17:52:46.133 回答