为什么没有迁移学习的结果比迁移学习更好?

数据挖掘 准确性 过拟合 迁移学习 数据增强 卷积神经网络
2021-10-15 12:43:32

我开发了一个用于车牌识别的神经网络,并使用了 EfficientNet 架构 ( https://keras.io/api/applications/efficientnet/#efficientnetb0-function ),在 ImageNet 上使用和不使用预训练权重,以及使用和不使用数据增强。我只有 10.000 个训练图像和 3.000 个验证图像。这就是我应用迁移学习和图像增强 ( AdditiveGaussianNoise) 的原因。

我创建了这个模型:

efnB0_model = efn.EfficientNetB0(include_top=False, weights="imagenet", input_shape=(224, 224, 3))
efnB0_model.trainable = False

def create_model(input_shape = (224, 224, 3)):
    input_img = Input(shape=input_shape)
    model = efnB0_model (input_img)
    model = GlobalAveragePooling2D(name='avg_pool')(model)
    model = Dropout(0.2)(model)
    backbone = model

    branches = []
    for i in range(7):
            branches.append(backbone)
            branches[i] = Dense(360, name="branch_"+str(i)+"_Dense_360")(branches[i])
            branches[i] = BatchNormalization()(branches[i])
            branches[i] = Activation("relu") (branches[i])
            branches[i] = Dropout(0.2)(branches[i])                        
            branches[i] = Dense(35, activation = "softmax", name="branch_"+str(i)+"_output")(branches[i])
        
    output = Concatenate(axis=1)(branches)
    output = Reshape((7, 35))(output)
    model = Model(input_img, output)

    return model

我编译了模型:

opt = keras.optimizers.Adam(learning_rate=0.0001)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=["accuracy"])

并使用此代码来适应它:

hist = model.fit(
    x=training_generator, epochs=10, verbose=1, callbacks=None,
    validation_data=validation_generator, steps_per_epoch=num_train_samples // 16,
    validation_steps=num_val_samples // 16,
    max_queue_size=10, workers=6, use_multiprocessing=True)

我的假设是:

H1:EfficientNet架构适用于车牌识别。

H2:迁移学习将提高车牌识别的准确性(与没有迁移学习的情况相比)。

H3:图像增强将提高车牌识别的准确性(与没有它的情况相比)。

H4:迁移学习结合图像增强会带来最好的结果。

我现在得到了这个结果:

在此处输入图像描述

因此,H1 似乎是正确的。但是 H2、H3 和 H4 似乎是错误的。

我正在考虑它并得到了对 H3 和 H4 的解释,这对我来说似乎是合乎逻辑的。也就是说,图像增强过于繁重,并且会在一定程度上降低图像质量,从而使网络很难识别字符。

1. 这个解释合适吗?还有其他解释吗?

似乎是这样,图像增强太强了。所以,第一个问题解决了。

关于H2,老实说,我有点困惑。网络似乎过度拟合,但在验证准确性方面完全停滞不前。因此,Imagenet 权重不适用的结论对我来说似乎不合逻辑,因为网络从训练数据中学到了一些东西。我还排除了数据量很小的可能性,因为我们在没有使用迁移学习或图像增强的情况下具有良好的识别率......

2. 这有什么合乎逻辑的解释吗?

2个回答

正如@fuwiak 所提到的,如果预先训练的模型已安装在“非常不同”的数据集上,则迁移学习可能不起作用。通常,如果预先训练的网络提取与您的问题无关的信息。

此外,在基于迁移学习的车牌识别系统(您与我分享)一文中,他们尝试冻结预训练 Xception 的某些层基于 ImageNet 权重)以查看对训练的影响。他们得出结论,ImageNet 数据和车牌数据差异太大,无法冻结图层。所以你的结果得到了证实

现在更改efnB0_model.trainable = FalseTrue将允许预先训练的网络更新并与您的问题更相关。一般来说,如果你没有时间问题,它似乎总是更好(见这篇文章)。它会比随机初始化权重提供更好的结果吗?我想一个人可以推测但不能知道。

至少两个问题:

负迁移

  • 如果初始问题和我们的问题相似,则迁移学习有效。不幸的是,我们认为有足够的相似之处,但这只是错觉。

数据贪婪

  • 如果我们提供更多数据,通常模型开始运行良好。