Проблема со слоем softmax в нейронной сети C++C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Проблема со слоем softmax в нейронной сети C++

Сообщение Anonymous »


Я реализовал простую нейронную сеть на C++. Кажется, он работает нормально для плотно связанных слоев, но у меня возникают проблемы при добавлении слоя softmax для классификации.

Сама функция softmax, которая генерирует значения активации на основе входных данных, выглядит корректной, но когда я обучаю сеть, она не улучшает классификацию. Я думаю, что проблема в коде обратного распространения, который отлично работает для плотного слоя. Так что, вероятно, дело в расчетах производных для слоя softmax.

Вероятно, с моим кодом что-то просто не так? Я перепробовал множество вариантов, но ничего не работает.

вот реализации функций активации:

double active_function_sigmoid(const double input) { вернуть 1/(1 + exp(-input)); } двойная активация_function_sigmoid_derivative (константный двойной вход) { возврат ввода * (1 – ввод); } двойная активация_функция_relu (константный двойной вход) { вернуть std::max(0.0, input); } двойная активация_функция_relu_derivative (константный двойной вход) { возврат (вход > 0,0)? 1,0:0,0; } двойная активация_функция_softmax (константный двойной ввод) { // просто возвращаем входные данные, они будут классифицированы позже обратный ввод; } двойная активация_function_softmax_derivative (константный двойной вход) { возврат ввода * (1 – ввод); } реализации функций стоимости:

double cost_function_mse(const double предсказание, const double target) { // Функция стоимости MSE, производная которой ниже представляет собой простое сложение! return 0,5 * pow((прогнозируемое - цель), 2); } двойная стоимость_функция_mse_derivative (const double предсказанная, const двойная цель) { // МСЭ прогнозируемая доходность - цель; } двойная стоимость_функция_rmse (константная двойная прогнозируемая, константная двойная цель) { return sqrt(0.5 * pow((прогнозируемое - цель), 2)); } двойная стоимость_функция_rmse_derivative (const double предсказанная, const двойная цель) { return (прогнозируемая цель) / sqrt(2.0); } двойная стоимость_функция_crossEntropy (константная двойная прогнозируемая, константная двойная цель) { // не используется, поскольку softmax выполняется по всему массиву. return - цель*exp(прогнозируется); } двойная стоимость_функция_crossEntropy_derivative (const double предсказанная, const двойная цель) { прогнозируемая доходность - цель; } Функция обратного распространения:

double Layer::BackwardsPass( константный слой и предыдущий слой, константный слой* nextLayer, const двойная скорость обучения, константный столбец и цели, CostFuncPtr ср, CostFuncPtr cfD) { двойная накопленная ошибка = 0; for (uint32 n=0; n numNeurons; k++) { error[n] += nextLayer->weights[k][n] * nextLayer->gradients[k]; } } если (!forClassification) градиенты[n] = ошибки[n] * afD(прогнозируется); // вызывает производную функцию активации еще градиенты[n] = прогнозируемые - цели[n]; } // Обновляем веса for (uint32 n=0; n
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»