首页 > 解决方案 > 用于二进制分类的 DCNN 收敛到 50%/50%

问题描述

我是 Keras 的新手,从来没有在这里问过问题,所以请原谅我可能犯的任何新手错误。我想要做的是实现一个二进制分类器,对图像进行操作(确切地说是 CT)。

我的模型基于一个预训练的网络,它对 14 个类进行了分类(参见这里的精彩 git https://github.com/jrzech/reproduce-chexnet)。

俗话说,“先爬再跑,再跑”,我目前的卑微目标是在大约 100 个示例上实现网络的过度拟合。我目前的问题是网络收敛到一个奇怪的解决方案,输出神经元(我使用 sigmoid)总是非常接近 50%,100% 的预测进入一个类(这样我就停留在大约 50% 的准确度) . 我的损失和准确性从第 1 个时期起根本没有改变。

我尝试/考虑的事情:

一切都失败了,所以我有点迷失在这里。如果需要,我很乐意提供更多详细信息,并感谢您提供的任何帮助或见解。附上我的代码的主要部分。请注意,我正在加载和使用的 ModelFactory() 是预训练的。

提前致谢!

数据生成器代码

rescale = 1./255.0
target_size = (224, 224)
batch_size = 128

train_datagen = ImageDataGenerator(
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    rescale=rescale
)

train_generator = train_datagen.flow_from_dataframe(
    train_csv,
    directory=train_path,
    x_col='image_name',
    y_col='class',
    target_size=target_size,
    color_mode='rgb',
    class_mode='binary',
    batch_size=batch_size,
    shuffle=True,
    )

我的模型

def get_model():
  file_name='/content/brucechou1983_CheXNet_Keras_0.3.0_weights.h5'
  base_model = ModelFactory().get_model(class_names=[str(i) for i in range(14)],
                                        weights_path=file_name)
  x = base_model.output
  x = keras.layers.Dense(1024, activation='relu')(x)
  x = keras.layers.BatchNormalization(trainable=True)(x)
  predictions = keras.layers.Dense(1, activation='sigmoid')(x)
  model = keras.models.Model(inputs=base_model.inputs, outputs=predictions)
  for layer in base_model.layers:
    layer.trainable = False

  model.summary()
  return model

训练模型

class_weight = sklearn.utils.class_weight.compute_class_weight('balanced',np.unique(train_csv['class']), train_csv['class'])
model.compile(keras.optimizers.SGD(lr=1e-6, decay=1e-6, momentum=0.9, nesterov=True),
              loss='binary_crossentropy',
              metrics=['binary_accuracy'])
history = model.fit_generator(
    train_generator,
    steps_per_epoch=len(train_generator),
    epochs=10,
    verbose=1,
    class_weight=class_weight
)

标签: tensorflowmachine-learningkerasclassificationconv-neural-network

解决方案


推荐阅读