tensorflow - 用于二进制分类的 DCNN 收敛到 50%/50%
问题描述
我是 Keras 的新手,从来没有在这里问过问题,所以请原谅我可能犯的任何新手错误。我想要做的是实现一个二进制分类器,对图像进行操作(确切地说是 CT)。
我的模型基于一个预训练的网络,它对 14 个类进行了分类(参见这里的精彩 git https://github.com/jrzech/reproduce-chexnet)。
俗话说,“先爬再跑,再跑”,我目前的卑微目标是在大约 100 个示例上实现网络的过度拟合。我目前的问题是网络收敛到一个奇怪的解决方案,输出神经元(我使用 sigmoid)总是非常接近 50%,100% 的预测进入一个类(这样我就停留在大约 50% 的准确度) . 我的损失和准确性从第 1 个时期起根本没有改变。
我尝试/考虑的事情:
- 使用不同的优化器(我使用了 Adam 优化器和以下 SGD)。
- 还尝试使用分类交叉熵(最后使用 softmax 层,而不是 sigmoid,因为有人说它可能表现更好[ Keras' fit_generator() 用于二进制分类预测总是 50%)。
- 添加一个额外的密集层(我认为我可能以某种方式欠拟合)。
- 尝试将批量大小更改为 128(并过度拟合 1000 个示例)。
一切都失败了,所以我有点迷失在这里。如果需要,我很乐意提供更多详细信息,并感谢您提供的任何帮助或见解。附上我的代码的主要部分。请注意,我正在加载和使用的 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
)
解决方案
推荐阅读
- python - 具有动态输入形状的 CNN
- c# - 如何在 Linq、windows 窗体中调用计算年龄和调用方法
- excel - 替代 application.calculation = xlcalculationmanual 以加快 mailmerge vba 代码?
- powershell - 在管道对象上调用方法
- python - 烧瓶 sqlite3 安全问题
- python - 根据条件更新 Numpy 数组
- dynamic - 如何从目录中获取文件列表?
- materialize - 如何在物化中使用 vanilla java-script 初始化轮播全角和指标?
- django - Django Admin中删除操作的奇怪错误
- angular7 - 会话过期时重定向到登录页面