深度学习在视觉问题方面的代码讲解

视觉问答的深度学习

 

预告

大约一年前,一个名为Eugene Goostman的聊天机构成为主流新闻,之后被报道为第一个在雷丁大学举办的活动中通过着名的图灵测试的计算机程序。虽然组织者称赞它是一项历史性成就,但大多数科学界并未留下深刻印象。这引出了一个问题:图灵测试,在其原始形式中,是否适合现代人工智能测试?

在过去几年中,许多论文(如来自JHU / Brown的这篇论文,以及来自MPI的这篇论文)表明,Visual Question Answering(简称VQA)的任务可以用作替代图灵测试。任务涉及回答关于图像的开放式问题(或一系列问题)。一个例子如下所示:

来自visualqa.org的图片

视觉质量保证

AI系统除了能够执行某种“常识”推理之外,还需要解决自然语言处理和计算机视觉中的许多子问题。它需要本地化被引用的主题(女人的脸,更具体地说是她嘴唇周围的区域),需要检测物体(香蕉),还应该有一些常识知识,经常使用胡子这个词来引用脸上的标记或物体实际上不是胡须(如牛奶胡须)。由于问题通过两种截然不同的模式(视觉和文本),并需要对场景进行高层次的理解,因此它似乎是真正的图灵测试的理想候选者。这个问题也有真实世界的应用,比如帮助视障人士

几天前,Visual QA Challenge发布了,随之而来的是一个大型数据集(约250K图像上约750K的问题)。在MS COCO图像字幕挑战引发了对图像字幕问题的大量兴趣(或者是导致挑战的兴趣?)之后,在NLP和Vision的交叉点上转移到更难的问题的时机似乎已经成熟。

本文将介绍使用神经网络对此问题进行建模的方法,探索前馈神经网络和更激动人心的递归神经网络(LSTM,具体而言)。如果您对神经网络知之甚少,那么我建议您查看这两个很棒的博客:Colah的博客Karpathy的博客。具体来说,查看关于递归神经网络,卷积神经网络和LSTM网络的帖子。本文中的模型从ICCV 2015论文ICCV 2015论文本NIPS 2015论文中获得灵感。

生成答案

解决此问题的一个重要方面是拥有一个可以生成新答案的系统。虽然VQA数据集中的大多数答案都很短(1-3个单词),但我们仍然希望系统能够产生任意长的答案,并与我们的图灵测试精神保持一致。我们也许可以从使用RNN的序列到序列学习的论文中获得灵感,在生成任意长度的翻译时解决类似的问题。多字方法已经提交给VQA了。但是,出于本篇博文的目的,我们将忽略问题的这一方面。我们将在VQA训练数据集中选择1000个最常见的答案,并在多级分类设置中解决问题。这些前1000个答案涵盖了VQA培训集中80%以上的答案,因此我们仍然期望得到合理的结果。

前馈神经模型

MLP模型

首先,让我们首先尝试使用MultiLayer Perceptron对问题进行建模。MLP是一种简单的前馈神经网络,它将特征向量(固定长度)映射到适当的输出。在我们的问题中,此输出将是可能答案集上的概率分布。我们将使用Keras,一个基于Theano的令人敬畏的深度学习库,并用Python编写。设置Keras相当容易,只需查看他们的自述文件即可开始使用。

为了使用MLP模型,我们需要将所有输入问题和图像映射到固定长度的特征向量。我们执行以下操作来实现此目的:

  1. 对于这个问题,我们将每个单词转换为单词向量,并总结所有向量。此特征向量的长度将与单个单词向量的长度相同,并且我们使用的单词向量(也称为嵌入)的长度为300
  2. 对于图像,我们将其传递通过深度卷积神经网络(众所周知的VGG架构),并从最后一层(在softmax层之前)提取激活。此特征向量的大小为4096

一旦我们生成了特征向量,我们现在需要做的就是在Keras中定义一个模型,设置一个成本函数和一个优化器,我们很高兴。以下Keras代码定义了一个多层感知器,它有两个隐藏层,每层1024隐藏单元,中间有丢失层,用于正则化。最后一层是softmax层,负责在可能的答案集上生成概率分布。我使用了categorical_crossentropy损失函数,因为它是一个多类分类问题。该rmsprop方法用于优化。您可以尝试使用其他优化器,并查看您获得的学习曲线类型。

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation

img_dim = 4096 #top layer of the VGG net
word_vec_dim = 300 #dimension of pre-trained word vectors
nb_hidden_units = 1024 #number of hidden units, a hyperparameter

model = Sequential()
model.add(Dense(nb_hidden_units, input_dim=img_dim+word_vec_dim, 
          init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(nb_hidden_units, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes, init='uniform'))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

查看整个python脚本,查看用于生成功能和培训网络的代码。一旦训练开始,它就不会访问硬盘,并且使用大约4GB的RAM。您可以通过降低batchSize变量来减少内存使用量,但这也会导致更长的培训时间。当在批量大小为128的GTX 760 GPU上工作时,它能够在不到160秒/纪元的情况下处理超过215K的图像 - 问题对。我将我的实验运行了100个纪元。

递归神经模型

LSTM模型

先前方法的缺点是我们忽略了问题的顺序性质。无论单词出现的顺序如何,我们都会得到代表问题的相同向量,即单词包(BOW)。解决此限制的一种方法是使用递归神经网络,它非常适合于顺序数据。我们将在这里使用LSTM,因为它们避免了一些常见的vanilla RNN细微差别,并且通常会提供稍微好一点的性能。您还可以在Keras中试验其他复发图层,例如GRU。对应于问题中的标记的单词向量以顺序方式传递给LSTM,并且在所有标记通过之后LSTM的输出(从其输出门)被选择作为整个问题的表示。该固定长度矢量与4096图像的尺寸CNN矢量连接,并传递给具有完全连接层的多层感知器。最后一层再次是softmax,它为我们提供了可能输出的概率分布。

可以加入2019年计算机类毕业生设计讨论群,群号:457756921

from keras.models import Sequential
from keras.layers.core import Dense, Activation, Merge, Dropout, Reshape
from keras.layers.recurrent import LSTM

num_hidden_units_mlp = 1024
num_hidden_units_lstm = 512
img_dim = 4096
word_vec_dim = 300

image_model = Sequential()
image_model.add(Reshape(input_shape = (img_dim,), dims=(img_dim,)))

language_model = Sequential()
language_model.add(LSTM(output_dim = num_hidden_units_lstm, 
			return_sequences=False, 
			input_shape=(max_len, word_vec_dim)))

model = Sequential()
model.add(Merge([language_model, image_model], 
			mode='concat', concat_axis=1))
model.add(Dense(num_hidden_units_mlp, init='uniform'))
model.add(Activation('tanh')
model.add(Dropout(0.5))
model.add(Dense(num_hidden_units_mlp, init='uniform'))
model.add(Activation('tanh')
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

train_on_batchKeras中的单个方法调用期望序列具有相同的长度(因此可以表示为Theano Tensor)。关于训练具有可变长度序列的LSTM已经有很多讨论,我使用了以下技术:按照它们的长度对所有问题进行排序,然后在训练时分批处理它们128。大多数批次都有相同长度的问题(例如9或10个单词),并且不需要零填充。对于那些确实有不同长度问题的少数批次,较短的问题是零填充。我能够在GTX 760 GPU上实现200秒/纪元的训练速度。

告诉我数字

我在VQA数据集的训练集上训练我的系统,并根据VQA挑战的规则评估验证集上的性能。神经网络产生的答案将根据人类提供的每个答案进行检查(每个问题都有十个人类答案)。如果神经网络产生的答案与十个答案中的至少三个完全匹配,那么我们将其归类为正确的预测。以下是我训练过的模型的表现:

模型准确性
BOW + CNN48.46%
仅限LSTM语言44.17%
LSTM + CNN51.63%

更新:我之前报告的结果基于与VQA上使用的指标略有不同的指标。它们已经更新。此外,我在测试开发集(LSTM + CNN)上获得了53.34%的性能,这几乎与VQA作者在其LSTM基线中设置的性能相同。

有趣的是,即使是“盲”模型也能够获得44.17%的准确度。这表明,一旦确定了问题的类型,该模型就能很好地猜测答案。与前馈模型(BOW + CNN)相比,LSTM + CNN模型显示出约3%的改进,这告诉我们问题的时间结构确实有用。这些结果与原始VQA论文中获得的结果一致。然而,论文中报告的结果是在测试集上(在训练+ val上训练),而我们已经评估了验证设置(仅在火车上训练)。如果我们在培训和验证数据上学习模型,那么我们可以预期性能会有显着提高,因为培训示例的数量将增加50%。最后,超参数调整的范围很广(隐藏单元的数量,MLP隐藏层的数量,LSTM层的数量,丢失或没有丢失等)。

我进行了100个时代1的实验,并观察了以下曲线:

验证准确性与时期数

在大约50个时期之后,LSTM + CNN模型的性能趋于平缓。BOW + CNN也表现出类似的行为,但在90年代出现了令人惊讶的跳跃,很快就被第100个时期纠正了。我可能会重新初始化并运行500个时代的模型,看看是否再次看到这种行为。更新:我再次运行它,并没有观察到下降!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值