c++ - 训练一个非常大的神经网络

标签 c++ cuda parallel-processing opencl neural-network

<分区>

我必须训练一个非常大的前馈神经网络来进行模式识别。

该网络有 10,000 个输入神经元,200 个输出神经元,它的隐藏层有 5100 个神经元。函数 x/(1 + abs(x)) 用作激活函数。

训练数据集大小为100,000。

问题是训练神经网络需要很长时间,这使得微调网络非常耗时。

我想到了两个可能提高训练表现的选择:

  • 将隐藏层的大小减少到 500 到 1000 之间的某个位置。这将显着减少所需的乘法运算次数。但是,我不确定这种减少是否会损害识别的准确性。
  • 获得一个高性能的矩阵乘法库(甚至可能引入 OpenCL/CUDA),目前只实现了朴素的矩阵乘法,这应该比仔细调整的慢。

有没有更好的选择?我是 ANN 的新手,欢迎提出任何建议。

谢谢。

最佳答案

一句话 - 首先调整隐藏层的大小,看看适合您需要的大小

我曾经编写过前馈反向传播的实现。网络的大小可能是唯一的因素,但在反向传播阶段你也有 etta(收敛因素)和其他因素(我需要记住,但我保证会尝试)。你也有一些技巧作为互相关。也可以尝试优化微分代码和激活函数(小x可能会引入数值问题,而且你有除法运算)

我的策略是首先检查隐藏层 - 与 10000 个输入神经元相比,隐藏层中的 5000 个神经元是一个相当大的隐藏层(但是,这取决于问题)。 要计算的函数数量是主要瓶颈——与隐藏层的大小成二次方。如果隐藏层中的节点数为 O(N),则外层和隐藏层之间要执行的功能数为 O(N^2)。 这是因为输入层中的每个节点都需要对隐藏层中的所有节点做出贡献,输出层和隐藏层也是如此。

在我处理的问题——图像压缩中,输入神经元大小的 1/8 甚至 1/16 就满足了我的需求。我强烈建议您首先测试隐藏层大小,看看您在什么地方可以在隐藏层大小和结果质量之间取得最佳权衡。

此外 - 前馈(和反向传播)可以以并行方式实现 - 考虑为此使用 open-mp。 通过并行处理,可以非常有效地完成每个节点中权重的累积。

关于c++ - 训练一个非常大的神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23826260/

相关文章:

c# - 方法的并行访问

c++ - 我正在尝试将灰度放入更大的黑色图像中。我收到此错误 OpenCV 错误 : Assertion failed

c++ - 在我的运行时cuda程序中,cpu和gpu可以异步计算,但不能协同计算,为什么?

Cuda 对 unsigned short 的原子操作

r - 如何并行运行 DEoptim?

c# - 使用 Parallel.ForEach (多线程)从列表中获取总和为值的元素数组

c++ - 当我们尝试从 hash_set 中删除不存在的键时会发生什么

c++ - 任务计划程序 : How to schedule a task to execute at login

c++ - 未对齐访问导致 ARM Cortex-M4 出错

c++ - CUDA:获取 3D 表面的子集