我正在做一个图像检索任务(不涉及人脸),其中一件事是在CNN模型中换出softmax层,并使用LMNN分类器。为此,我对模型进行了微调,然后在完全连接层提取了特征。我现在有大约3000张图片。完全连接的层提供了4096个暗淡的向量。所以我的最后一个向量是一个3000x4096的向量,大约有700个类(每个类都有2+图像)。我相信这是一个非常大的维度大小,LMNN算法将永远花费(它确实花费了永远)。如何减少维度?我尝试了PCA,但这并没有太多地压缩尺寸(降到3000x3000)。我认为256/512/1024维度向量应该能够有所帮助。如果我要添加另一个层来减少维度,比如说一个新的完全连接的层,我是否必须再次微调我的网络?如何做到这一点的输入将是很棒的!我目前还在尝试增加我的数据,以获得更多的每个类的图像,并增加我的数据集的大小。
谢谢。
发布于 2017-01-23 13:30:58
主成分分析应该让你进一步减少数据-你应该能够指定所需的维度-参见the wikipedia article。
除了PCA,你还可以尝试t-distributed stochastic neighbor embedding。我真的很喜欢Wattenberg, et al.'s article -如果你想深入了解它的工作原理和一些陷阱,值得一读。
在神经网络中,降维的标准方法是按照您的建议添加更多、更小的层。因为它们只能在训练中学习,所以您需要重新运行您的微调。理想情况下,如果您对模型结构进行了更改,您将重新运行整个训练过程,但如果您有足够的数据,可能仍然可以。
要在TensorFlow中添加新层,需要添加一个完全连接的层,该层的输入是3000元素层的输出,输出大小是所需的元素数。如果您想逐渐下降(例如3000 -> 1024 -> 512),您可以重复此步骤。然后,您将再次执行训练(或微调)。
最后,我做了一个快速搜索,发现这篇文章声称通过随机抽样支持大数据集上的LMNN。你也许可以用它来省去一些麻烦:Fast LMNN Algorithm through Random Sampling
https://stackoverflow.com/questions/41798975
复制相似问题