我正在为C ++中的前馈神经网络编写反向传播的实现,而我正在使用Armadillo库。现在,我正在使用方法load
为Armadillo库中的类matrix
加载训练数据。两个问题:
1)这是否适合存储适合主存储器(<2GB)的预格式化(CSV)数字数据?当然,有比其他人更好的方法来做到这一点,并且很高兴知道这是不是一个好的做法。部分我觉得这不是保存数据的好选择,因为可能有更多的数据结构/框架(比如我应该访问某些SQL数据库或其他东西)。我的另一部分感觉就像数字数据在定义上只是矩阵所以这应该是美妙的。
2)我需要在没有替换的情况下从我的实现中的数据集中进行采样,并且我看到两条路径:要么我可以对数据集的行进行洗牌,要么对数据集索引的数组进行洗牌。在Armadillo库中有shuffle
类的matrix
方法,我怀疑洗牌的是地址而不是行本身。这不会像改组索引数组一样高效吗?
答案 0 :(得分:1)
1)是的,这很好,我会这样做,但请注意,Armadillo矩阵是列专业的,因此您可能需要转置您加载的CSV。如果您的数据足够大以至于它不适合主存储器,您可以考虑编写一个自定义CSV解析器,以流式传感的方式查看数据(即一次一个点),从而减少RAM占用空间,或者您甚至可以使用mmap()
将一个包含双打的文件映射为矩阵,让内核计算出需要交换的内容。
2)因为所有矩阵数据都是连续存储的(即double*
而非double**
),shuffle()
将移动矩阵中的元素。我通常在这种情况下做的是创建一个索引向量并将其改组:
uvec indices = linspace<uvec>(0, n, n);
shuffle(indices);
// Now loop over each shuffled point...
for (uword i = 0; i < n; ++i)
{
// access the point with data.col(indices[i]) and do whatever
}
(上面的代码没有经过测试,但是它应该可以工作或轻松地适应有效的东西。)
对于它的价值,mlpack(http://www.mlpack.org/)确实有一个使用Armadillo的不稳定的神经网络基础设施,你可能值得花时间去看看;下面的链接是直接到相关的源,但在Github和mlpack网站上浏览应该显示更好的文档。
https://github.com/mlpack/mlpack/tree/master/src/mlpack/methods/ann