После профилирования моего алгоритма обратного распространения я узнал, что он отвечает за 60% моего времени вычислений. Прежде чем я начну рассматривать параллельные альтернативы, я хотел бы посмотреть, что еще я могу сделать.
Функция activate (const double input [])
профилирована так, чтобы занимать только ~ 5% время.
Функция gradient (const double input)
реализована следующим образом:
inline double gradient(const double input) { return (1 - (input * input)); }
Обучающая функция, о которой идет речь:
void train(const vector& data, const vector& desired, const double learn_rate, const double momentum) {
this->activate(data);
this->calculate_error(desired);
// adjust weights for layers
const auto n_layers = this->config.size();
const auto adjustment = (1 - momentum) * learn_rate;
for (size_t i = 1; i < n_layers; ++i) {
const auto& inputs = i - 1 > 0 ? this->outputs[i - 1] : data;
const auto n_inputs = this->config[i - 1];
const auto n_neurons = this->config[i];
for (auto j = 0; j < n_neurons; ++j) {
const auto adjusted_error = adjustment * this->errors[i][j];
for (auto k = 0; k < n_inputs; ++k) {
const auto delta = adjusted_error * inputs[k] + (momentum * this->deltas[i][j][k]);
this->deltas[i][j][k] = delta;
this->weights[i][j][k] += delta;
}
const auto delta = adjusted_error * this->bias + (momentum * this->deltas[i][j][n_inputs]);
this->deltas[i][j][n_inputs] = delta;
this->weights[i][j][n_inputs] += delta;
}
}
}
}
Этот вопрос лучше подходит для https://codereview.stackexchange.com / .