После профилирования моего алгоритма обратного распространения я понял, что он занимает 60% моего вычислительного времени. Прежде чем я начну рассматривать параллельные альтернативы, я хотел бы узнать, могу ли я что-нибудь сделать дальше.
Функция activate(const double input[])
профилируется, чтобы занимать только ~ 5% времени.
Функция gradient(const double input)
реализована следующим образом:
inline double gradient(const double input) { return (1 - (input * input)); }
Обучающая функция:
void train(const vector<double>& data, const vector<double>& 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/.