为什么这个 ResNet50 会错误分类对象?

人工智能 机器学习 深度学习 分类 图像识别 喀拉斯
2021-11-17 11:42:31

我是深度学习的新手,我有一些概念上的问题。我在这里遵循了一个简单的教程,并在 Keras 中训练了一个模型来对 10 类徽标进行图像分类。我准备了 10 个班级,每个班级有近 100 张图片。当图像是这 10 个徽标之一时,我的训练Resnet50模型表现异常出色,概率为 1.00。但问题是,如果我传递一个非徽标项目,一个在视觉上完全不相关的随机图像,它仍然以接近 1.00 的概率将其标记为那些徽标之一!

我糊涂了。我错过了什么吗?为什么会这样?如何找到解决方案?我需要在视频帧中找到徽标。但是现在,每一帧都被标记为一个标志的可能性很高!

这是我的简单训练代码:

def build_finetune_model(base_model, dropout, fc_layers, num_classes):
    for layer in base_model.layers:
        layer.trainable = False

    x = base_model.output
    x = Flatten()(x)
    for fc in fc_layers:
        # New FC layer, random init
        x = Dense(fc, activation='relu')(x) 
        x = Dropout(dropout)(x)

    # New softmax layer
    predictions = Dense(num_classes, activation='softmax')(x) 
    finetune_model = Model(inputs=base_model.input, outputs=predictions)
    return finetune_model
finetune_model = build_finetune_model(base_model, dropout=dropout, fc_layers=FC_LAYERS, num_classes=len(class_list))
adam = Adam(lr=0.00001)
finetune_model.compile(adam, loss='categorical_crossentropy', metrics=['accuracy'])
filepath="./checkpoints/" + "ResNet50" + "_model_weights.h5"
checkpoint = ModelCheckpoint(filepath, monitor=["acc"], verbose=1, mode='max')
callbacks_list = [checkpoint]

history = finetune_model.fit_generator(train_generator, epochs=NUM_EPOCHS, workers=8, 
                                       steps_per_epoch=steps_per_epoch, 
                                       shuffle=True, callbacks=callbacks_list)

plot_training(history)
1个回答

你的问题是分类问题。如果您按照本教程进行操作,则它使用的是 ResNet50 网络,它是一种卷积神经网络,最后有一个全连接层。最后激活函数是softmax。激活函数的详细描述可以在这里找到:Softmax 函数解释

Softmax 上的 Udacity 深度学习幻灯片

基本上,softmax 增加了较高概率和较低概率之间的差异。它还将输出限制在 0 和 1 之间。

问题根源

由于 softmax 函数的性质,它总是选择最好的一个并将值放大到接近 1 的值,即使输出预测的范围非常小,例如 0-0.1。此外,您的训练数据仅标记了 10 个徽标的数据,因此如果网络看到未识别的没有徽标的图像,它会预测最相似的图像。如果要对其中没有徽标的图像进行分类,则应在训练数据集中添加一个额外的类,以及训练网络学习将不在 5 类中的图像分类为单独的可能称为未标记的图像的代码。希望我能帮助你,祝你有美好的一天。