首页 > 解决方案 > 我的二元分类模型的准确性似乎卡住了:我哪里出错了?

问题描述

我曾尝试使用由医学图片组成的数据集(确切地说是 LIDC 数据集)来训练二元分类问题的模型,据我所知,这应该与“狗与猫”分类问题相距太远。(区分良恶性结节)

问题是,准确率似乎卡住了,从一开始到大约 65% 并且似乎根本没有改变。难道我做错了什么 ?我朋友提供的示例很容易达到 80% 以上,并且准确率不断提高,但不是我的:/

我正在对已经提取的补丁进行培训,所有补丁的大小都相同,并分为两类。

我使用 VGG16 为这个任务微调的模型(我用新的替换了 FC 层,冻结了前一层并尝试训练)

我尝试更改为 binary_crossentropy,应用 to_categorical,将最后一层从 1 更改为 2。在他的观点上,我对解决我的问题的参数的正确组合感到困惑。对不起,如果我听起来像一个绝对的初学者......

我尝试跳过代码中信息较少的部分,希望它可读

training_data_dir = "flow/training" 

validation_data_dir = "flow/validation" 

test_data_dir = "flow/test" 

from keras.preprocessing.image import ImageDataGenerator
training_data_generator = ImageDataGenerator(rescale=1./255)
validation_data_generator = ImageDataGenerator(rescale=1./255)
test_data_generator = ImageDataGenerator(rescale=1./255)


training_generator = training_data_generator.flow_from_directory(
    training_data_dir,
    target_size=(IMAGE_WIDTH, IMAGE_HEIGHT),
    batch_size=BATCH_SIZE,
    class_mode="binary")
validation_generator = validation_data_generator.flow_from_directory(
    validation_data_dir,
    target_size=(IMAGE_WIDTH, IMAGE_HEIGHT),
    batch_size=BATCH_SIZE,
    class_mode="binary")
test_generator = test_data_generator.flow_from_directory(
    test_data_dir,
    target_size=(IMAGE_WIDTH, IMAGE_HEIGHT),
    batch_size=1,
    class_mode="binary", 
    shuffle=False)


vgg16_model = VGG16(weights="imagenet", include_top=False,input_tensor=Input(shape=(57, 57, 3)))
vgg16_model.summary()

model = Sequential()

for layer in vgg16_model.layers:
layer.trainable = False
  model.add(layer)

model.add(Flatten())

model.add(Dense(4096, activation='relu'))
model.add(Dense(1024, activation='relu'))
model.add(Dense(1, activation='softmax'))


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


model.fit_generator(training_generator,
    steps_per_epoch=len(training_generator.filenames) // BATCH_SIZE,
    epochs=EPOCHS,
    validation_data=validation_generator,
    validation_steps=len(validation_generator.filenames) // BATCH_SIZE, 
    verbose=2)

标签: pythonmachine-learningkeras

解决方案


由于您有一个单单元输出层和二元交叉熵损失,因此您应该sigmoid在最后一层使用激活;将其更改为:

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

至少对于初学者来说,让 Adam 保持默认学习率也是可取的,即:

optimizer=keras.optimizers.Adam()

在你的model.compile.


推荐阅读