为什么使用imageDataAugmenter不会增加我的训练数据集的大小?

33ビュ(過去30日間)
我试图使用imageDataAugmenter来增加我的训练数据集的大小(训练图像的数量),但它似乎根本没有任何效果。解释一下:我使用简单的CNN从三个类别中对图像进行分类。每个类别有200张图片(120张训练图片,40张验证图片,40张测试图片)。创建imageDatastores:
[TrainDataStore,ValDataStore,TestDatastore] = splitEachLabel(imds,0.6,0.2,'randomize');*
培训网络
*net = trainNetwork(TrainDataStore,mynet_1,options)
因此,由于epoch和miniBatch的数量在所有情况下都是相同的(5)和(60),我得到了30次迭代和每个epoch 6次迭代。6(迭代)* 60 (miniBatch)= 360张图像(每个标签120张)。
我尝试使用数据增强,如下所示:
*augmenter = imageDataAugmenter(“RandRotation”30 [0]); *
*[TrainDataStore,ValDataStore,TestDatastore] = splitEachLabel(i_mds,0.6,0.2,“随机”); *
训练数据源= augmentedImageSource([200 200 3],TrainDataStore,'DataAugmentation',augmenter);
net = trainNetwork(训练数据源,mynet_1,options);
最后我又得到了每个Epoch(6)次迭代,5个Epoch,这意味着图像的总数是相同的(360),尽管它应该增加,因为我们有一个旋转属性。
我不知道增强后的数据集会有多大,但它肯定会比原始数据集大。如果我的方法中有什么遗漏,请让我知道。

採用された回答

J
J 2018 年 3 月 23 日
我猜,当增强被打开时,它“完全”按照关闭时的方式训练,但对每个训练示例执行随机转换(在您的情况下是旋转),并将其呈现给网络,而不是原始的训练示例。网络很少会看到完全相同的训练示例两次,因为考虑到转换是随机的,这是不可能的,而且它很少会看到实际训练示例的精确副本,因为随机生成器需要旋转图像(在您的情况下)的数量接近0度,以至于当考虑到离散化时,它实际上根本不会旋转图像,这是可能的,但不太可能。
这显然与你所期待的不同;也就是说,你希望它生成一组更大的增强训练数据,然后将其分解成小批量,在每个Epoch中反复呈现给网络,这样每个Epoch将发生更多迭代,并且每个Epoch将看到相同的图像。
不幸的是,R2017b文档中至少没有提到这一点,我怀疑2018a文档中是否也提到了这一点。你的问题是有效的,如果Mathworks想成为这里的长期参与者,他们可能应该在他们的NN工具箱中投入更多的资源来提供文档和功能。

その他の回答(2件)

徐明捷
徐明捷 2018 年 8 月 8 日
因为。imageDataAugmenter函数的数据增加不是传统的内存数据增加。假设您的数据集太大,无法在内存中分配它们。因此,matlab的工作人员利用数据增强的思想,拟合计算机有限的内存,参考这个网站:https://ww2.mathworks.cn/help/nnet/ug/preprocess-images-for-deep-learning.html#mw_ef499675-d7a0-4e77-8741-ea5801695193。
更详细地说,在配置图像转换选项后,训练数据集的大小在每个epoch始终相同。然而,对于每次训练的迭代,增强图像数据存储对小批训练数据应用随机组合的转换。因此,在每个纪元中,训练数据集的数量总是相同的,但每个训练图像都有一些不同,这是由于您的转换操作,如旋转。

人阅读
人阅读 2019 年 9 月 27 日
对于那些还在读这篇文章的人:有一个解决方案!
我和你的想法一样,凯撒。然而,鉴于J的答案,有一个变通办法。如果网络很少看到相同的训练示例两次,考虑到增强器的作用,我们可以增加trainingOptions中的epoch数:
这样,虽然我们没有在一个epoch内表示整个数据集,但我们在N个epoch内表示整个数据集,其中N是我们假设增广器乘以样本容量的倍数。如果我们将纪元数增加N,我们就会得到我们最初期望的东西,我相信(如果我错了,请纠正我!)

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!

翻译的