python - 我的二元分类模型的准确性似乎卡住了 : Where did i go wrong?

标签 python machine-learning keras

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

问题是,准确率似乎卡住了,从一开始到 65% 左右,而且似乎根本没有变化。难道我做错了什么 ?我 friend 提供的例子很容易就达到了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)

最佳答案

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

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

建议将 Adam 保留为默认学习率,至少对于初学者而言,即:

optimizer=keras.optimizers.Adam()

在你的model.compile中。

关于python - 我的二元分类模型的准确性似乎卡住了 : Where did i go wrong?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58392266/

相关文章:

python - 有没有什么方法可以改变多类分类问题中目标类的数量?

c# - 如何将 Asp.net 页面与 Python 项目集成?

machine-learning - LSTM 后接均值池化

tensorflow - 是否有可能有一个返回数组(或张量)而不是数字的度量?

python - 使用 pandas groupby 查找每个组内文本的平均长度

python - 如果一次读取整个文件需要 with 语句?

python - 从具有列表元素的系列创建堆叠的 Pandas 系列

python - 如何连接两行上指定的标识符?

python - 打印随机森林分类器中特定样本的决策路径

python - Keras 中使用 LSTM 进行多元多时间序列回归的恒定输出值