0

我正在编写一个程序,用于将图像分为两类:“电线”和“非电线”。我手工标记了大约 5000 张显微镜图像,例如:

非电线

在此处输入图像描述

金属丝

在此处输入图像描述

我使用的神经网络改编自“Deep Learning with Python”,关于卷积网络的章节(我认为卷积网络在这里没有必要,因为没有明显的层次结构;密集网络应该更合适):

model = models.Sequential()
model.add(layers.Dense(32, activation='relu',input_shape=(200,200,3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(2, activation='softmax'))

然而,在使用网络参数时,经过 10 个 epoch 训练后的测试准确率不会超过 92%。训练图像包含大约 1/3 的电线,2/3 的非电线。我的问题:您是否发现这种神经网络设计中有任何明显的错误会抑制准确性,或者您是否认为我受到图像质量的限制?我有大约 4000 个训练图像和 1000 个测试图像。

4

1 回答 1

1

通过尝试使用权重字典处理类不平衡,您可能会得到一些改进。如果非电线的标签是 0,电线的标签是 1,那么权重字典将是

weight_dict= { 0:.5, 1:1}

在 model.fit 集中

 class_weight=weight_dict .

在没有看到训练结果(训练损失和验证损失)的情况下,不知道还能做什么。如果您过度拟合,请尝试添加一些 dropout 层。还建议您尝试使用 keras 回调 ReduceLROnPlateau 进行可调整学习,并使用 keras 回调 EarlyStopping 提前停止。文档在这里。设置每个回调以监控验证丢失。我建议的代码如下所示:

reduce_lr=tf.keras.callbacks.ReduceLROnPlateau(
          monitor="val_loss",factor=0.5, patience=2, verbose=1)
e_stop=tf.keras.callbacks.EarlyStopping( monitor="val_loss", patience=5, 
          verbose=0,  restore_best_weights=True)
callbacks=[reduce_lr, e_stop]

在 model.fit 中包括

callbacks=callbacks

如果你想尝试卷积网络,我建议使用 Mobilenetmodel 进行迁移学习。文档在这里。. 我的推荐代码如下:

base_model=tf.keras.applications.mobilenet.MobileNet( include_top=False, 
          input_shape=(200,200,3) pooling='max', weights='imagenet',dropout=.4) 
x=base_model.output
x=keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001 )(x)
x = Dense(1024, activation='relu')(x)
x=Dropout(rate=.3, seed=123)(x) 
output=Dense(2, activation='softmax')(x)
model=Model(inputs=base_model.input, outputs=output)
model.compile(Adamax(lr=.001),loss='categorical_crossentropy',metrics= 
              ['accuracy'] )

在 model.fit 中包含如上所示的回调。

于 2021-01-20T17:22:11.127 回答