训练 ConvNet
卷积神经网络的一个优点就是你可以输入任何图像,只要你喜欢(带上一些标签),然后它们就开始学习如何识别这些标签了。在这个例子里,我们将一些好的自拍和差的自拍作为卷积神经网络的输入,接着它将神奇的发现如何区分一张自拍照是好的还是差的。让我们先搞点自拍图:
我写了一个小脚本来抓取带有#selfie标签的图片。最后我抓了大概500万张图片(在卷积神经网络中,图片总是多多益善)。
我用另一个卷积神经网络将这500万张图中不带人脸的图片扔了,最后还剩下200万张图片。
接下去就是去挑选哪些自拍是好的,哪些自拍是差的。直观上讲,我们需要去计算一张自拍有多少人看过,然后将点赞的人数和粉丝群体的大小用一个函数关联起来。首先,我拿了所有的自拍用户,并将他们按照粉丝的数量进行排序,排序时,我会给图片上每一个额外的标签加一些些分,因为额外的标签也许能吸引更多的目光。
接下来,我将这些排好序用户以100为大小分组,根据点赞的数量对这100张自拍图进行排序。这里我只选用了已经在网上挂了超过一个月的图,目的是得到一个比较稳定的点赞数。我将排在前面的50张自拍作为好的自拍,排在后50张的自拍作为差的自拍。最终,我们将整个200万张图一分为二,一半是好的自拍一半是差的自拍,然后我们又对可能看过所有自拍的人数做了一次归一化处理。我还将那些粉丝数量太少或者太多的用户过滤掉了,还有一些图片上有太多标签的也被过滤了。
用上面这个100万好自拍,100万差自拍的数据集来训练一个卷积神经网络。
到这里,你可能会反对我判断一张自拍是好是差的方法——比如说,有人上传了一张非常棒的自拍,但是上传时间是半夜,因此可能不会有很多人看到它,那它得到的点赞也就少了,这时候该怎么办?你说的对——我的这种分类方法肯定有问题,不过没关系,只要这100万张好自拍中真正好的自拍更多就行了,卷积神经网络可以处理这种事情。它不会因此而迷惑或者气馁,它只是尽自己的全力去解读这些输入。为了让大家对区分好差自拍这个问题的难度有一个感性认识,我把一些训练用的图像贴在下面。假如我给你任意一张图,你能很准确的回答它是好自拍还是差自拍吗?
在我们的训练数据中显示好和坏自拍的示例图像。 这些将作为数据提供给ConvNe
简单介绍一些实现细节,我用了Caffe来训练这个卷积神经网络。我用了一个在ImageNet预训练过的VGGNet,并针对这次的自拍数据集精调了参数。我用一块英伟达K40GPU花了一个通宵来训练这个模型。我禁用了模型中的 dropout选项,因为我发现禁用的结果更好一些。我还试着用一个在人脸数据集上预训练的VGGNet,不过结果并不比ImageNet预训练的好。最终,模型在测试集上达到了60%的准确率 (比随机猜50%的准确率好一些)。
怎么拍出好自拍?
刚才说道,我们收集了200万的自拍图,又根据它们接受到的点赞数(对粉丝数量做了控制)将他们分成了好的自拍和差的自拍,然后将它们扔进Caffe来训练一个卷积神经网络。这个卷积神经网络将每一张自拍都了“看”数十次,以此来调整它使用的滤波器,为了找到一种最佳的方式来区分好自拍和差自拍。我们没办法去确切地检查它找出来的东西(这些滤波器的参数总共有1亿4千万个)。不过呢,我可以用它没见过的自拍图问它是好是差,进而去理解它是通过什么来判断一张自拍的好与差的。
我用了5万张自拍图作为我的测试数据(这些自拍图是这个卷积神经网络没见过的)。作为第一个可视化结果,下面这张图里我将这些自拍图按照从好到差的顺序排列出来,最好的自拍在最上面一排,最差的自拍在最下面一排: