我如何改善CNN的准确性?

时间:2019-09-07 13:42:46

标签: python tensorflow keras

因此,我正在尝试创建一个CNN,该CNN可以预测X射线胸腔图像中是否有“支持设备”,但是在训练我的模型时,似乎没有学到任何东西。

我正在使用一个名为“ CheXpert”的数据集,该数据集可以使用20万多个图像。经过一些“清理”后,最终的数据集最终得到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”,则结果将发生变化。

2 个答案:

答案 0 :(得分:0)

缺少标记为“ 0”的图像对CNN毫无帮助。我还建议降低学习率,并尝试批量大小以查看是否有所变化。 希望对您有帮助。

答案 1 :(得分:0)

由于训练数据不平衡,建议您在训练步骤中设置“ class_weight”。您拥有的数据越多,您设置的class_weight越低。

class_weight = {0: 1.5, 1: 0.5}
model.fit(X, Y, class_weight=class_weight)

您可以在keras document中检查class_weight的增加量。

class_weight:可选的字典将类索引(整数)映射到 权重(浮动)值,用于对损失函数(在 仅培训)。这可能有助于告诉模型“支付更多 注意”来自代表性不足的班级的样本。