我尝试使用由医学图片组成的数据集(确切地说是 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/