我有一个图像数据集用于分类目的。数据集非常大,大多数图像彼此重复。基本上,相同的图像多次出现。而且,数据集是不平衡的。 我理解清理重复数据集的动机。但这样做既广泛又耗时。 有没有办法在这个数据集上训练网,而不是过度拟合模型? 可以执行更严厉的正规化,辍学,惩罚损失仍然可以产生一个可用的模型?
答案 0 :(得分:0)
重复并不意味着过度拟合;他们在训练中给予这个形象更多的重量。是的,你可以训练数据集;结果将是有效的。例如,如果您有相同数量的重复项(例如,所有内容中的10项)。然后你会得到相同的结果,就像你只有一个 - 或几乎一样:洗牌顺序可能会略微影响训练的平衡,因为单个图像现在可以在纪元1的开始附近多次出现。
您列出的各种反措施都是防止过度拟合的好工具,但您的主要危险仅仅是您所拥有的:一小组独特示例的潜力。
答案 1 :(得分:0)
正如Jon.H在评论中所建议的那样,您可以使用图像哈希来检测数据集并将其从数据集中删除,而不是在具有重复项的数据集中训练模型。尽管加密哈希(例如MD5和SHA1)足以找到精确重复项,但根据您的评论,您还希望摆脱相似的图像,而不仅仅是精确的重复项(您真的要这样做吗?拥有更大的数据集通常更适合训练,并且保持相似的图像具有很小的变化(例如颜色)并不一定是一件坏事-请参阅“数据增强”)。
为图像生成哈希值对于像素的微小变化并不稳健 值,例如轻微的光线变化,肉眼看不到,但 像素值不同。 -罗妮卡·杰斯瓦(Ronica Jethwa)
对此的一种解决方案是使用perceptual hashing,它对于颜色,旋转度,图像长宽比等方面的微小差异非常强大。特别是,我建议您尝试使用基于离散余弦变换的pHash算法作为Looks-Like-It中描述。有一个实现它的python库,称为imagehash
。使用方法如下:
from PIL import Image
import imagehash
# Compute the perception-hash values (64 bit) for two images
phash_1 = imagehash.phash(Image.open('image_1')) # e.g. d58e11ce51ee15aa
phash_2 = imagehash.phash(Image.open('image_2')) # e.g. d58e01ae519e559e
# Compare the images using the Hamming distance of their perception hashes
dist = phash_1 - phash_2
然后由您来选择汉明距离的相似性阈值。
答案 2 :(得分:0)
在这个老问题上加上我的分。
在培训期间,仅当您很可能在一个批次中有很多重复项时,问题才会出现。
假设您选择的批量大小为64;由于您将随机采样图像以组成批次,因此平均而言您可能只有2个重复项。这实际上取决于与图像总数成比例地(平均)将图像复制多少次。
无论如何,使用(在线)数据增强可以缓解该问题,即使在相同的图像之间,这种数据引入也会带来一些差异。
最大的问题在于测试集,因为准确性估计将偏向具有更多重复项的图像,因此,我会努力并重复测试(和验证)集的重复数据。
答案 3 :(得分:0)
如果验证集中的图像与火车集中的图像相同,但测试集中的图像不同,则验证将提供比测试更好的(准确性)分数。在这种情况下,就像过拟合一样。复制自然到处都是,所以一定可以。
答案 4 :(得分:0)
使用重复数据进行训练。使用表示向量,即最后一次卷积的输出。如果您使用预训练的 CNN 模型,请使用最终的模型。在表示向量上应用 knn 或聚类并识别重复项。删除重复项并保留您的模型。