【问题标题】:Neural Network optimization for image classification in keras/tensorflowkeras/tensorflow中图像分类的神经网络优化
【发布时间】:2021-01-20 16:22:45
【问题描述】:

我正在编写一个程序,用于将图像分为两类:“Wires”和“non-Wires”。我手动标记了大约 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 轮训练后的测试准确率不会超过 92%。训练图像包含大约 1/3 的电线,2/3 的非电线。我的问题:您是否发现这种神经网络设计中有任何明显的错误会抑制准确性,或者您认为我受到图像质量的限制?我有大约 4000 个训练图像和 1000 个测试图像。

【问题讨论】:

  • 图片的大小是多少。从我所看到的情况来看,与图像中的像素总数相比,感兴趣区域中的像素数似乎很小。不同意使用卷积网络,但您的图像太小而无法说明太多。
  • 您检查了错误分类的图像吗?我也不同意 CNN 不适合的说法。卷积层提供了一些位置不变性,我相信您希望在这个用例中使用它。
  • 图片尺寸为 200x200x3。关于位置不变性:图像以可能的电线为中心。但是,是的,我会再次尝试 convnets - 谢谢!

标签: python tensorflow keras neural-network image-classification


【解决方案1】:

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

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

在model.fit集合中

 class_weight=weight_dict .

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

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

如果您想尝试卷积网络,我建议您使用 Mobilenet 模型进行迁移学习。相关文档是here.。我的推荐代码如下:

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 中包含如上所示的回调。

【讨论】:

  • 如果有帮助请告诉我
猜你喜欢
  • 2019-07-13
  • 2020-02-14
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多