machine-learning - 如何让图像识别深度网络检测微小差异

标签 machine-learning image-recognition mxnet

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

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

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

谢谢!

最佳答案

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

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

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

您可以使用 MXNet Gluon 轻松开始迁移学习。在下面的代码片段中,我们将权重从已经在 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)

关于machine-learning - 如何让图像识别深度网络检测微小差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48865895/

相关文章:

machine-learning - 用于图像识别、图像大小的 TensorFlow

machine-learning - 如何在 mxnet.gluon 中定义每层学习率?

python - 如何将一维 ndarray 列表转换为二维 ndarray (mxnet ndarray)

python - 如何修复:- libmxnet.所以:无法打开共享对象文件:没有这样的文件或目录

javascript - 机器学习模型中的无效元素类型

machine-learning - 为什么词嵌入实际上是向量?

opencv - 训练数据和词汇表的区别——词袋

computer-vision - 使用 TensorFlow 构建简单的图像搜索

python - 无法使用 AWS-Lambda 调用在 sagemaker 中创建的 XG-Boost 端点

python - 如何计算Keras训练准确率的平均值?