我的矩阵数学在以下函数中是否效率过低?我在Visual Studio中启用了优化功能,并以64位发布模式进行构建。我正在通过此处喂入相当大的矩阵(750X350),但是我的表现似乎仍然很慢。
void NeuralNetwork::backward(Eigen::MatrixXf back, float learningRate)
{
std::vector<Eigen::MatrixXf> dedw;
std::vector<Eigen::MatrixXf> delta;
int nLayers = layers.size();
int dIt = 0;
for (int i = nLayers -1;i > 0; i=i-1)
{
Eigen::MatrixXf deltai;
logger->LogVerbose("--------","Back", i,"---------");
if (i == (nLayers - 1))
{
deltai.noalias() = back.cwiseProduct(dSigmoid(X[i]));
delta.push_back(deltai);
dIt++;
}
else
{
logger->LogVerbose("W", i);
deltai.noalias() = (W[i].transpose() * delta[dIt - 1]).cwiseProduct(dSigmoid(X[i]));
delta.push_back(deltai);
dIt++;
}
Eigen::MatrixXf dedwi;
dedwi.noalias() = delta[dIt - 1] * X[i - 1].transpose();
dedw.push_back(dedwi);
logger->LogVerbose("dedw", dIt - 1, dedw[dIt - 1]);
Eigen::MatrixXf WiNew;
WiNew.noalias() = W[i - 1] - learningRate * dedw[dIt - 1];
W[i-1] = WiNew;
logger->LogVerbose("W", i - 1);
logger->LogVerbose(W[i - 1]);
Eigen::MatrixXf BiNew;
BiNew.noalias() = B[i - 1] - learningRate * delta[dIt - 1];
B[i-1] = BiNew;
logger->LogVerbose("B", i - 1);
logger->LogVerbose(B[i - 1]);
}
}
避免在性能敏感的代码中使用内存密集型操作。
例如
void NeuralNetwork::backward(Eigen::MatrixXf back, float learningRate)
应该是
void NeuralNetwork::backward(const Eigen::MatrixXf& back, float learningRate)
这避免了在函数中一次又一次地复制构造参数。
delta
和dedw
向量矩阵推入。您可能想要这样移动它们:delta.push_back(std::move(deltai));
delta
和dedw
工作空间向量。即使最小化不必要的分配-分配。如果您不需要上一个调用中的元素,只需清除它们即可。这些将是要做的第一件事。最后-profile!
我将使用perf record
分析程序中的瓶颈。挤出最大性能的最佳方法是修复最大的瓶颈。在这一点上,您不知道最大的瓶颈在哪里。因此,个人资料,个人资料,个人资料。