用于图像识别的神经网络可能非常大。可能有数千个输入/隐藏神经元,数百万个连接会占用大量计算机资源。
虽然浮点数在 c++中通常是 32 位和双64 位,但它们在速度上没有太大的性能差异,但使用浮点数可以节省一些内存。
有一个神经网络是什么使用sigmoid作为激活函数,如果我们可以选择神经网络中的哪些变量可以是float或double,哪些可以float来节省内存而不会使神经网络无法执行?
虽然训练/测试数据的输入和输出绝对可以是浮点数,因为它们不需要双精度,因为图像中的颜色只能在 0-255 的范围内,当归一化为 0.0-1.0 比例时,单位值将为 1 / 255 = 0.0039 ~
1.隐藏神经元的输出精度怎么样,让它们也浮动是否安全?
隐藏神经元的输出从前一层神经元输出的总和 * 其与当前正在计算的神经元的连接权重中获取值,然后将总和传递给激活函数(当前为 sigmoid)以获得新的输出。Sum 变量本身可能是双倍的,因为当网络很大时它可能会变成一个非常大的数字。
2. 连接权重怎么样,它们可以是浮点数吗?
由于 sigmoid,输入和神经元的输出在 0-1.0 的范围内,但允许权重大于此值。
由于激活函数的导数,随机梯度下降反向传播会遇到梯度消失问题,我决定不把它作为梯度变量应该是什么精度的问题,感觉浮点数根本不够精确,特别是当网络很深时.
GPU在并行计算方面非常快,并且执行CPU的速度为15-30(有些甚至报告甚至50倍)然而,GPU内存与CPU内存相比非常有限,GPU内存与CPU之间的通信速度并不快.
让我们说我们有一些不适合GPU内存的数据,但我们仍然想用它来计算奇迹.我们可以做的是将数据分成几部分并逐一将其提供给GPU.
将大数据发送到GPU可能需要一些时间,人们可能会想,如果我们将数据块分成两部分并提供前半部分,运行内核然后在内核运行时提供另一半,该怎么办?
通过这种逻辑,我们应该节省一些时间,因为数据传输应该在计算过程中进行,希望不会中断它的工作,一旦完成,它就可以继续它的工作,而无需等待新的数据路径.
我必须说我是gpgpu的新手,对cuda是新手,但我一直在尝试使用简单的cuda代码,并注意到用于在CPU和GPU之间传输数据的函数cudaMemcpy将阻止kerner运行.它将等到内核完成然后才能完成它的工作.
我的问题是,是否有可能完成上述内容,如果可以,可以展示一个例子或提供一些如何完成的信息来源?
谢谢!