深度学习表征的不合理有效性——从头开始构建图像搜索服务(二)

本文涉及的产品
图像搜索,7款服务类型 1个月
简介: 还在为搜索引擎的工作原理感到困惑吗?看完本篇就可以自己动手构建搜图服务了。

接着上篇《深度学习表征的不合理有效性——从头开始构建图像搜索服务(一)》的内容,上次遇到的问题是搜索相似图的时候还是会出现瑕疵,因此本文介绍相关的处理办法

半监督搜索

       解决上文问题的常用方法是,首先使用目标检测模型,检测猫图像,然后对原始图像裁剪之后再进行图像搜索,这样做会很大程度地增加计算开销,如果可能的话,希望能够避免这种开销。
       有一种更简单的“hacky”方法,包括重新权衡激活值,这可以通过加载最初丢弃的最后一层权重来完成,并且仅使用与正在寻找的类索引相关联的权重来重新加权嵌入。例如,在下图中,使用Siamese cat类的权重来重新权衡数据集上的激活(用绿色突出显示)。

12加权嵌入


       根据Imagenet,Siamese cat中的 284类权衡激活,来研究它是如何工作的。
       正在搜索类似的图像 todataset / bottle / 2008_000112.jpg使用加权特征:
13
图像13

16


       可以看到,搜索一直偏向于寻找Siamese cat的照片,而不再展示任何的瓶子图像,此外,可能会注意到最后一张照片是一只羊!这就非常有趣了,此时的模型又导致了另外一种不同类型的错误,但模型更适合目前的任务需求。
       从上面的结果可以看出,通过宽泛方式搜索类似的图像,或者通过调整模型所训练的特定类别,使得模型向前迈出的了一大步,但由于使用的是在Imagenet上预训练的模型,因此仅限于1000个Imagenet类别。这些类别不能包罗万象,所以希望找到更加灵活的东西。另外,如果我们只是在不提供输入图像的情况下搜索猫呢?
       为了做到这一点,使用的不仅仅是简单的技巧,还需利用一个能够理解单词语义能力的模型。

文本-->文本

嵌入文本

       下面进入自然语言处理(NLP)世界,可以使用类似的方法来索引和搜索单词。
       从GloVe加载了一组预先训练的矢量,这些矢量是通过从维基百科上爬虫并学习该数据集中单词之间的语义关系而获得的。
       像之前一样创建一个索引,这次包含所有GloVe向量。之后就可以在嵌入中搜索类似的单词。
       例如,搜索said,返回[word,distance]列表:

  • ['said', 0.0]
  • ['told', 0.688713550567627]
  • ['spokesman', 0.7859575152397156]
  • ['asked', 0.872875452041626]
  • ['noting', 0.9151610732078552]
  • ['warned', 0.915908694267273]
  • ['referring', 0.9276227951049805]
  • ['reporters', 0.9325974583625793]
  • ['stressed', 0.9445104002952576]
  • ['tuesday', 0.9446316957473755]
           这似乎非常合理,大多数单词在含义上与我们的原始单词非常相似,或代表一个合适的概念。最后的结果(tuesday)也表明这个模型存在一些瑕疵,但它会让我们这种方法会让我们开始起步。现在,让我们尝试在模型中既包含单词,又包含图像。

一个大问题

       使用嵌入之间的距离作为搜索方法似乎看起来非常合理,大多数单词在含义上与原始单词非常相似,但对单词和图像的表示似乎并不兼容。图像的嵌入大小为4096,而单词的嵌入大小为300,如何使用一个来搜索另一个?此外,即使两个嵌入大小都相同,它们也会以完全不同的方式进行训练,因此图像和相关单词很可能不会发生有随机相同的嵌入。因此,需要训练一个联合模型。
图像<-->文本
       现在创建一个混合模型,可以从单词到图像,反之亦然。
       在本教程中,将第一次实践自己的模型,模型是从一篇名为DeViSE的优秀论文中汲取灵感。我们的想法是通过重新训练图像模型,并改变其标签的类型来结合这两种表示。
       通常,图像分类器被训练为从许多类中选择一个类别(Imagenet为1000类)。以Imagenet为例,转化最后一层为大小1000的一维向量来表示每个类的概率。这意味着模型没有语义理解哪些类与其他类相似,即将猫的图像分类为狗导致与将其分类为飞机的错误是一样的。
       对于混合模型,用我们的类别单词向量替换模型的最后一层,这允许模型学习到将图像语义映射到单词语义,这也意味着类似的类将彼此更接近(因为cat的单词向量比airplane更靠近dog)。我们将预测一个大小为300的语义丰富的单词向量,而不是大小为1000的单词向量,通过添加两个全连接层来实现此目的:

  • 一个大小为2000的中间层
  • 一个大小为300的输出层(GloVe单词向量的大小)
           以下是在Imagenet上训练模型时的样子:

14_jpeg


       这是修改后模型的样子:

15_jpeg

训练模型

       在数据集的训练集上重新训练我们的模型,以学习预测与图像标签相关联的单词向量。例如,对于具有类别cat的图像,尝试预测与cat相关联的300长度向量。训练需要一些时间,但这仍然要比Imagenet训练快得多。
       与通常的数据集相比,本文使用的训练数据(数据集的80%作为训练集,即800个图像)是微不足道的(Imagenet有一百万张图像)。如果使用传统的类别训练技术,我们不会指望模型在测试集上表现得非常好,并且也不会期望它在全新的例子上有不错的效果。
       一旦模型被训练好,就可以从上面获得GloVe单词索引,并通过运行数据集中的所有图像,将其保存到磁盘,构建图像特征的新快速索引。

标注

       现在可以轻松地从任何图像中提取标签,只需将我们的图像提供给训练有素的网络,保存出来的大小为300的矢量,并从GloVe中找到英语单词索引中最接近的单词。让我们试试下面这张图片——它的类别标签是瓶子,虽然它包含各种各样的物品。
图像16
       以下是生成的标签:

  • [6676, 'bottle', 0.3879561722278595]
  • [7494, 'bottles', 0.7513495683670044]
  • [12780, 'cans', 0.9817070364952087]
  • [16883, 'vodka', 0.9828150272369385]
  • [16720, 'jar', 1.0084964036941528]
  • [12714, 'soda', 1.0182772874832153]
  • [23279, 'jars', 1.0454961061477661]
  • [3754, 'plastic', 1.0530102252960205]
  • [19045, 'whiskey', 1.061428427696228]
  • [4769, 'bag', 1.0815287828445435]
           这是一个非常好的结果,因为大多数标签非常相关。这种方法仍然有提升空间,但它可以很好地掌握图像中的大多数元素。该模型学习提取许多相关标签,甚至从未经过训练的类别中提取到的!

使用文本搜索图像

       最重要的是,可以使用联合嵌入,输入任何单词都可以搜索图像数据库。只需要从GloVe获取预先训练好的单词嵌入,并找到具有最相似嵌入的图像即可。

使用最少数据进行广义图像搜索。

       首先从搜索dog这个词开始:

17


搜索 dog术语的结果
       结果相当不错,但是我们可以从标签上训练的任何分类器中都得到这个!
搜索 ocean术语的结果。
       模型了解 oceanwater类似,并从 boat类中返回许多物品。
       搜索街道又会发生什么呢?

18搜索“street”的结果


       从图中可以看到,返回的图像来自各种类别( cardogbicycle, bus, person),但大多数图像都包含或靠近街道,尽管我们在训练模型时从未使用过这个概念。因为通过预先训练的单词向量,利用外部知识来学习比简单类别在语义上更丰富的图像向量映射,所以模型可以很好地概括为外部概念。

无以言表

       英语虽然已经发展了很久,但还不足以为一切都有对应的词。例如,没有英文单词表示“躺在沙发上的猫”,但这是一个对输入搜索引擎完全有效的查询。如果想要同时搜索多个单词,就可以使用一种非常简单的方法,即利用单词向量的算术属性。事实证明,总结两个单词向量通常是非常有效的。因此,如果只是通过使用猫和沙发的平均单词矢量来搜索我们的图像,就可以希望获得非常像猫、像沙发一样的图像、或者在沙发上有猫的图像。

20多个单词的组合嵌入


       下面使用混合嵌入搜索

21搜索sofa+cat的结果


       从图中可以看到,结果不错。因为大多数图像都包含一些毛茸茸的动物和一个沙发。我们的模型只训练单个单词,也可以处理两个单词的组合,但还没有构建Google Image Search,但对于相对简单的架构来说,本文绝对是有用的。
       这种方法实际上可以很自然地扩展到各种域,感兴趣的读者可以应用于各自的领域之中。

结论

       希望读者能够发现这篇文章内容的丰富,它揭开了一些基于内容的推荐和语义搜索世界的神秘面纱,感兴趣的读者快上手试试吧。

数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!

作者信息

Emmanuel Ameisen,AI研究者
个人主页:https://twitter.com/EmmanuelAmeisen
本文由阿里云云栖社区组织翻译。
文章原标题《The unreasonable effectiveness of Deep Learning Representations》,译者:海棠,审校:Uncle_LLD。
文章为简译,更为详细的内容,请查看原文

相关文章
|
27天前
|
机器学习/深度学习 数据采集 人工智能
从零构建:深度学习模型的新手指南###
【10月更文挑战第21天】 本文将深入浅出地解析深度学习的核心概念,为初学者提供一条清晰的学习路径,涵盖从理论基础到实践应用的全过程。通过比喻和实例,让复杂概念变得易于理解,旨在帮助读者搭建起深度学习的知识框架,为进一步探索人工智能领域奠定坚实基础。 ###
45 3
|
1月前
|
机器学习/深度学习 数据采集 自然语言处理
使用Python实现深度学习模型:智能客户服务与支持
使用Python实现深度学习模型:智能客户服务与支持
34 6
|
1月前
|
机器学习/深度学习 自然语言处理 自动驾驶
深度学习之常识知识库构建
基于深度学习的常识知识库构建是一项旨在自动化获取和组织广泛的常识性信息的技术,它通过深度学习模型从文本、图像、语音等多种数据源中提取出隐含的常识知识,并构建一个可以被机器理解和应用的知识库。
48 4
|
2月前
|
机器学习/深度学习 JavaScript 前端开发
谈谈基于深度学习的图像搜索
本文介绍了人脸识别技术及其应用,其中详细描述了向量化和余弦相似度的概念。人脸识别通过摄像头获取面部信息并与数据库中的信息对比,判断用户身份。向量化包括基于特征和基于卷积神经网络的方法,而余弦相似度则用于计算两个向量之间的相似程度,值越接近1表示越相似。通过具体实例和公式推导,展示了如何计算向量间的余弦相似度。
72 5
谈谈基于深度学习的图像搜索
|
1月前
|
机器学习/深度学习 数据采集 自然语言处理
【NLP自然语言处理】基于PyTorch深度学习框架构建RNN经典案例:构建人名分类器
【NLP自然语言处理】基于PyTorch深度学习框架构建RNN经典案例:构建人名分类器
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
3月前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习入门:使用Python和TensorFlow构建你的第一个神经网络
【8月更文挑战第31天】 本文是一篇面向初学者的深度学习指南,旨在通过简洁明了的语言引导读者了解并实现他们的第一个神经网络。我们将一起探索深度学习的基本概念,并逐步构建一个能够识别手写数字的简单模型。文章将展示如何使用Python语言和TensorFlow框架来训练我们的网络,并通过直观的例子使抽象的概念具体化。无论你是编程新手还是深度学习领域的新兵,这篇文章都将成为你探索这个激动人心领域的垫脚石。
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习之旅:构建你的第一个神经网络
【8月更文挑战第31天】在人工智能的浪潮下,深度学习技术正以前所未有的速度改变世界。本文将带你走进深度学习的大门,通过构建一个简单的神经网络模型,探索其背后的原理与实践。我们将从基础概念入手,逐步实现一个能够识别手写数字的神经网络,并在此过程中揭示深度学习的魅力和力量。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往深度学习世界的新窗户。
|
3月前
|
机器学习/深度学习 分布式计算 PyTorch
构建可扩展的深度学习系统:PyTorch 与分布式计算
【8月更文第29天】随着数据量和模型复杂度的增加,单个GPU或CPU已无法满足大规模深度学习模型的训练需求。分布式计算提供了一种解决方案,能够有效地利用多台机器上的多个GPU进行并行训练,显著加快训练速度。本文将探讨如何使用PyTorch框架实现深度学习模型的分布式训练,并通过一个具体的示例展示整个过程。
162 0
|
3月前
|
机器学习/深度学习 PyTorch 测试技术
深度学习入门:使用 PyTorch 构建和训练你的第一个神经网络
【8月更文第29天】深度学习是机器学习的一个分支,它利用多层非线性处理单元(即神经网络)来解决复杂的模式识别问题。PyTorch 是一个强大的深度学习框架,它提供了灵活的 API 和动态计算图,非常适合初学者和研究者使用。
54 0
下一篇
无影云桌面