python - 我的二元分类模型的准确性似乎卡住了:我哪里出错了?
问题描述
我曾尝试使用由医学图片组成的数据集(确切地说是 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)
解决方案
由于您有一个单单元输出层和二元交叉熵损失,因此您应该sigmoid
在最后一层使用激活;将其更改为:
model.add(Dense(1, activation='sigmoid'))
至少对于初学者来说,让 Adam 保持默认学习率也是可取的,即:
optimizer=keras.optimizers.Adam()
在你的model.compile
.
推荐阅读
- angular - spyOn 无法处理 Angular 7 单元测试中的依赖项
- arrays - 遍历数组以匹配结果
- javascript - 表单 - 单击按钮时清除所有文本和其他组件元素
- php - 尝试调用函数时 CodeIgniter 出现水印问题
- javascript - 如何将标签和计算函数从 VueCLI 中的组件导出到主 App.vue
- c++ - 如何编写程序来计算这个方程
- azure - 删除 CosmosDB 中的“外键”关系?
- python - 绘制多个条形图。怎么修?
- java - 为什么查询谷歌云文件返回一个空列表?
- git - 在 git 中 rebase 时如何记录合并冲突解决方案?