【问题标题】:Our training/validation loss curves are great but the testing performance suffers我们的训练/验证损失曲线很好,但测试性能受到影响
【发布时间】:2021-09-15 16:02:01
【问题描述】:

我们目前正在进行一项图像分类任务,用于从胸部 X 射线图像中检测结核病。您可以在下面看到我们的代码。我们使用 0.7 作为训练集,0.2 作为验证集,0.1 作为测试集。我们的训练和验证损失在这里

但是当我们在我们的测试数据集上进行尝试时,我们得到了这样的结果:

我们的代码有问题吗?提前谢谢你。

from tensorflow import keras
from keras.applications.mobilenet_v2 import MobileNetV2
from keras.applications.mobilenet_v2 import preprocess_input
from keras.layers import Dense, Flatten
from keras.models import Sequential
from keras.losses import BinaryCrossentropy
from tensorflow.keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator
from datetime import datetime, date
from keras.callbacks import ModelCheckpoint
from sklearn.metrics import confusion_matrix, classification_report
import numpy as np

#Loading a pre-trained model
image_size = 224

base_model = MobileNetV2(input_shape=(image_size,image_size,3), weights='imagenet', include_top=False)

for layer in base_model.layers:
    layer.trainable = False

model = Sequential()
model.add(base_model)
model.add(Flatten())
model.add(Dense(1000, activation='relu'))
model.add(Dense(2, activation="sigmoid"))

loss_func = BinaryCrossentropy()
opt = Adam(learning_rate=0.001)

model.compile(loss=loss_func,
              optimizer=opt,  
              metrics=['accuracy'])

#Training
test_path = '...' 
val_path = '...'

datagen = ImageDataGenerator(rescale = 1./255,horizontal_flip = True, shear_range = 0.2, zoom_range=0.2)

batch_size=32
validation_size=8

train_set = datagen.flow_from_directory(test_path, 
                                        target_size = (image_size, image_size),
                                        batch_size=batch_size,
                                        class_mode = 'categorical')

validation_set = datagen.flow_from_directory(val_path, 
                                             target_size = (image_size, image_size),
                                             batch_size=validation_size,
                                             class_mode = 'categorical')

#Fitting the data to the model
model_name = 'MobileNetV2'
date_today= date.today().strftime('%m_%d_%Y')

checkpoint = ModelCheckpoint(filepath=f'Models/{model_name}_{date_today}.h5',
                             monitor='val_loss',
                             mode='min',
                             verbose=1, 
                             save_best_only=True)

model_history = model.fit(train_set, 
                          validation_data=validation_set,
                          epochs=100,
                          steps_per_epoch=len(train_set)//batch_size,
                          validation_steps=len(validation_set)//validation_size,
                          callbacks=[checkpoint],
                          verbose=1)


#Testing the model on the test set
test_path = '...'

test_datagen = ImageDataGenerator()

test_set = test_datagen.flow_from_directory(test_path,
                                            target_size = (image_size, image_size),
                                            class_mode = 'categorical')

predictions = model.predict(test_set, verbose=1)

y_pred = np.argmax(predictions, axis=1)
class_labels = list(test_set.class_indices.keys())  

print('Classification Report')
clsf = classification_report(test_set.classes, y_pred, target_names=class_labels)
print(clsf)
print('\n')
print('Confusion Matrix')
cfm = confusion_matrix(test_set.classes, y_pred)
print(cfm)

【问题讨论】:

    标签: python machine-learning deep-learning conv-neural-network transfer-learning


    【解决方案1】:

    代码是正确的,但是我发现了一个小错误,那就是您在 sigmoid 输出层中分配了 2 个单元。这是不正确的;应该有 1 个单元,因为这是一个二元分类问题。像这样:

    model.add(Dense(1, activation="sigmoid"))
    

    【讨论】:

      【解决方案2】:

      结核病是一个具有复杂特征的复杂对象。因此,测试集可能会产生意想不到的结果。为了避免这种情况,您必须修改您的网络并合并额外的训练图像。您可以尝试迁移学习,但如果您要从中迁移参数的网络是在与结核病完全无关的对象上训练的,则可能不合适。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-26
        • 2019-07-09
        • 2017-08-10
        • 2019-04-02
        相关资源
        最近更新 更多