【发布时间】:2016-11-28 08:25:00
【问题描述】:
我在 MATLAB 中实现了一个神经网络,以便更好地理解该主题。
我想在我的 GPU 上运行代码,所以我用 gpuArray() 初始化了每个矩阵,但没有得到性能提升。此外,有时 GPU 比 CPU 慢。我已经学会了使用arrayfun、pagefun 等函数。
在反向传播中,我有一个 for 循环,它向后计算每一层的增量误差。但是,计算需要先前计算的结果,我不知道如何使用*fun() 函数来执行此操作。
我的 CPU 是 i5-3570,我的 GPU 是 GTX 660 Ti。 我已经在 MATLAB 中测试了GPUBench,GPU 比 CPU 快 x 倍,所以我认为错误出在我的代码中。
TL;DR
如何改进这个用于 GPU 计算的 MATLAB 代码?
delta_output = (predicted - NN.Y) .* NN.activationGradient(predicted);
delta_hidden(:, :, m) = (delta_output * NN.Theta_output) .* ...
NN.activationGradient(NN.a_hidden(:, :, m));
for i = m-1:-1:1
delta_hidden(:, :, i) = (delta_hidden(:, 2:end, i+1) * ...
NN.Theta_hidden(:, :, i)) .* ...
NN.activationGradient(NN.a_hidden(:, :, i));
end
predicted、NN.y、NN.Theta_* 都是gpuArray。我已经将delta_* 初始化为gpuArray,但它没有任何区别。
【问题讨论】:
-
欢迎来到 GPU 计算!首先要学习:GPU 中并非一切都更快。取决于数据量、问题本身等。最重要的是,MATLAB 只在 GPU 中为您做了一些事情,但它是一个非常糟糕的 GPU 编程工具。将数据放在 GPU 上很慢,您确定那段 CODE 上的所有内容都在 GPU 上运行吗?否则你会让我来回移动数据并减慢一切。此外,该索引(例如
NN.activationGradient(NN.a_hidden(:, :, i)))可能会减慢代码速度。
标签: matlab loops neural-network gpgpu backpropagation