所以,我正在尝试创建一个 CNN,它可以预测 X 射线胸部图像中是否有任何“支持设备”,但在训练我的模型时,它似乎没有学习任何东西。
我正在使用一个名为“CheXpert”的数据集,它有超过 200,000 张图像可供使用。经过一些“清理”后,最终数据集包含 100,000 张图像。 就模型而言,我导入了 vgg16 预训练模型的卷积基础,并由我自己添加了 2 个完全连接的层。然后,我冻结了所有卷积基础并仅可训练完全连接的层。这是代码:
from keras.layers import GlobalAveragePooling2D
from keras.models import Model
pretrained_model = VGG16(weights='imagenet', include_top=False)
pretrained_model.summary()
for layer in pretrained_model.layers:
layer.trainable = False
x = pretrained_model.output
x = GlobalAveragePooling2D()(x)
dropout = Dropout(0.25)
# let's add a fully-connected layer
x = Dense(1024, activation='relu')(x)
x = dropout(x)
x = Dense(1024, activation = 'relu')(x)
predictions = Dense(1, activation='sigmoid')(x)
final_model = Model(inputs=pretrained_model.input, outputs=predictions)
final_model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
据我所知,正常的行为应该是准确性应该从低开始,然后随着时代的发展而增长。但在这里它仅在相同的值(0.93 和 0.95)之间振荡。很抱歉我无法上传图像来向您展示图表。
总而言之,我想知道准确性的微小差异是否意味着模型没有学习任何东西。
我有一个假设:在数据集中的所有 100,000 张图像中,95,000 张具有标签“1”,只有 5,000 张具有标签“0”。我认为如果减少“1”的图像,将它们与“0”的图像等同,结果会改变。
缺少标有“0”的图像对 CNN 毫无帮助。我还建议降低学习率并调整批量大小,看看是否会发生变化。 我希望它有帮助。
由于训练数据不平衡,我建议您可以在训练步骤中设置“class_weight”。您拥有的数据越多,您设置的 class_weight 就越低。
class_weight = {0: 1.5, 1: 0.5}
model.fit(X, Y, class_weight=class_weight)
你可以在keras文档中查看class_weight的增广。
class_weight:可选字典将类索引(整数)映射到 权重(浮点)值,用于对损失函数进行加权(期间 仅培训)。这对于告诉模型“支付更多费用”很有用 注意”来自代表性不足的班级的样本。