【问题标题】:How to make an image recognition deep net detect small differences如何让图像识别深度网络检测细微差异
【发布时间】:2018-02-19 12:07:14
【问题描述】:

我目前正在使用 Apache MXNet 进行机器学习项目,我正在使用 Inception V3 模型(MXNet 模型动物园上的 imagenet1k-inception-bn 模型)。

我目前正在尝试训练一个模型来区分两种对象类型,但对象之间的差异很微妙。我发现该模型仍然混淆了另一件事,因为它看起来几乎相同。

例如,假设您正在尝试训练模型来区分短吻鳄和鳄鱼。乍一看,人类区分它们的方法之一是观察它们鼻子的形状。在训练机器学习模型时,我是给它整个短吻鳄和鳄鱼的图像并希望它弄清楚,还是只给它鼻子的图像,因为这是我关注的区别?

谢谢!

【问题讨论】:

    标签: machine-learning image-recognition mxnet


    【解决方案1】:

    像 Inception 这样的深度学习模型能够在提供足够数据的情况下学习这些特征。您不需要裁剪到认为对区分这两个类别有用的特征。理想情况下,一个或多个卷积过滤器将检测到鼻子中的某些形状,并能够正确分类。

    不过,您不应该对模型抱有不合理的期望。如果仅凭视觉数据不足以让专家对某些短吻鳄与鳄鱼进行分类,那么您不应期望该模型能够做得更好。您应该建立一个人类基准表现,并以此进行比较。

    与所有模型一样,数据质量/数量是最重要的部分。我强烈建议你也考虑迁移学习;使用在更大数据集上学习的权重作为起点。以this blog post 为例。您可以在模型末尾训练全连接层,以区分短吻鳄和鳄鱼。甚至是 fine tune the convolutional layers 以提高性能。

    您可以使用 MXNet Gluon 轻松开始迁移学习。在下面的 sn-p 中,我们将权重从已经在 ImageNet(具有 1000 个类)上训练的 Inception v3 模型转移到非常相似的二元分类模型(除了最后几层之外相同)。然后,您可以使用自己的数据训练此网络。

    import mxnet as mx
    
    pretrained_net = mx.gluon.model_zoo.vision.get_model(name='inceptionv3', pretrained=True, classes=1000, prefix='aligcroc_')
    net = mx.gluon.model_zoo.vision.get_model(name='inceptionv3', classes=2, prefix='aligcroc_')
    net.features = pretrained_net.features
    net.output.initialize()
    
    batch_size = 1
    channels = 3
    height = width = 299
    data_batch = mx.ndarray.random.normal(shape=(batch_size, channels, height, width))
    net(data_batch)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 2017-03-25
      • 2017-09-12
      • 2011-09-19
      • 2016-03-18
      • 1970-01-01
      • 2019-09-18
      相关资源
      最近更新 更多