深度学习模型无法预测多个类别中的某一特定类别

问题描述 投票:0回答:1

我尝试使用 VGG16 网络对总共 8 个类别进行分类。使用分层五折交叉验证方法进行分类。在此过程中,存在这样的情况:每次折叠中来自“AFL”类别的所有样本都被预测为“AFIB”类别。此外,有些情况下,除了一个样本外,所有样本都被预测为“AFIB”,而在另一种情况下,预测“AFL”的准确率约为 60%。

Figure 1. Fold_1 Confusion matrix

Figure 2. Fold_2 Confusion matrix

Figure 3. Fold_4 Confusion matrix

总而言之,

是否有可能,即使深度学习模型做出了错误的预测,也存在一种高度偏差的情况,即所有 AFL 样本都被预测为相同的不同类别(如图 1 所示)?这可能是代码错误的结果吗?

*领域说明:AFIB 和 AFL 具有相似的特征,因此很难区分。

def create_additional_model(input_shape=(150, 530, 1), learning_rate=0.00005):
    additional_model = Sequential()
    additional_model.add(Conv2D(input_shape=input_shape, filters=64, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=64, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="same"))
    additional_model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="same"))
    additional_model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="same"))
    additional_model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="same"))
    additional_model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="same"))
    additional_model.add(Flatten())
    additional_model.add(Dense(units=512, activation="sigmoid"))
    additional_model.add(Dense(units=256, activation="sigmoid"))
    additional_model.add(layers.Dropout(0.5))
    additional_model.add(Dense(units=8, activation="softmax"))

    optimizer = RMSprop(lr=learning_rate, rho=0.9, epsilon=None, decay=0.0)
    additional_model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

    return additional_model


additional_model = create_additional_model(input_shape=(150, 530, 1), learning_rate=0.00005)

checkpoint = ModelCheckpoint(f'lightBSMgeneration_Resized_(15_x_max_length)x10_Hold_one_out.h5', 
                             monitor='val_accuracy', 
                             save_best_only=True,
                             mode='max', 
                             verbose=1)
    
history=additional_model.fit(X_train, y_train, epochs=40, batch_size=16,validation_data=(X_test, y_test),callbacks=[checkpoint])
python deep-learning confusion-matrix vgg-net
1个回答
0
投票

正如您所说,如果 AFIB 和 AFL 具有非常相似的特征分布,那么非常深的网络拓扑很可能无法完美地区分它们,并且您可能会过度拟合这两个类别中的大多数类别。

实际上,更浅的架构可能更适合您的问题。我建议你建立一个两步分类器。在唯一的一门课程中加入 AFIB 和 AFL。如果第一个分类器为您提供了样本属于新的预测,那么您可以将样本传递给仅在 AFIB 和 AFL 样本上训练的第二个分类器,但在这种情况下,分为两个不同的类。

© www.soinside.com 2019 - 2024. All rights reserved.