训练数据结构和访问
Training data structure and access
我正在用 C++ 编写前馈神经网络的反向传播实现,我正在使用 Armadillo 库。现在,我正在使用 Armadillo 库中的 class matrix
方法 load
加载训练数据。两个问题:
1) 这是存储适合主内存 (<2GB) 的预格式化 (CSV) 数字数据的合理选择吗?当然,有比其他方法更好的方法来做到这一点,很高兴知道这是否 不是 一个好的做法。我的一部分感觉这不是保存数据的好选择,因为可能有更多数据 structures/frameworks(比如我应该访问一些 SQL 数据库或其他东西)。我的另一部分感觉数字数据根据定义只是矩阵,所以这应该很棒。
2) 我需要在我的实现中不替换地从数据集中进行采样,我看到了两条路线:我可以打乱数据集的行或打乱索引数据集的数组。 Armadillo 库中有一个 matrix
class 的 shuffle
方法,我怀疑被洗牌的是地址而不是行本身。这不会像洗牌索引数组一样有效吗?
1) 是的,这很好,我就是这样做的,但请注意犰狳矩阵是列优先的,因此您可能需要转置您加载的 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 的尚未稳定的神经网络基础设施,可能值得您花时间检查一下;下面的 link 直接指向相关来源,但在 Github 和 mlpack 网站上搜索应该会显示更好的文档。
https://github.com/mlpack/mlpack/tree/master/src/mlpack/methods/ann
我正在用 C++ 编写前馈神经网络的反向传播实现,我正在使用 Armadillo 库。现在,我正在使用 Armadillo 库中的 class matrix
方法 load
加载训练数据。两个问题:
1) 这是存储适合主内存 (<2GB) 的预格式化 (CSV) 数字数据的合理选择吗?当然,有比其他方法更好的方法来做到这一点,很高兴知道这是否 不是 一个好的做法。我的一部分感觉这不是保存数据的好选择,因为可能有更多数据 structures/frameworks(比如我应该访问一些 SQL 数据库或其他东西)。我的另一部分感觉数字数据根据定义只是矩阵,所以这应该很棒。
2) 我需要在我的实现中不替换地从数据集中进行采样,我看到了两条路线:我可以打乱数据集的行或打乱索引数据集的数组。 Armadillo 库中有一个 matrix
class 的 shuffle
方法,我怀疑被洗牌的是地址而不是行本身。这不会像洗牌索引数组一样有效吗?
1) 是的,这很好,我就是这样做的,但请注意犰狳矩阵是列优先的,因此您可能需要转置您加载的 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 的尚未稳定的神经网络基础设施,可能值得您花时间检查一下;下面的 link 直接指向相关来源,但在 Github 和 mlpack 网站上搜索应该会显示更好的文档。
https://github.com/mlpack/mlpack/tree/master/src/mlpack/methods/ann