Странное поведение функции потери при обучении CNN - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь обучить свою сеть на MNIST, используя самодельный CNN (C ++).

Это дает достаточно хорошие результаты, когда я использую простую модель, например: Convolution (2 карты функций, 5x5) (Tanh) -> MaxPool (2x2) -> Flatten -> Fully-Connected (64) (Tanh)) -> Полностью подключен (10) (Сигмоид).

После 4 эпох он ведет себя так, как здесь 1 .
После 16 эпох он дает ошибку ~ 6,5% в тестовом наборе данных.

Но в случае с 4 картами объектов в Conv значение MSE не улучшается, иногда даже увеличивается в 2,5 раза 2 .

Используется онлайн-режим обучения с помощью оптимизатора Adam (альфа: 0,01, бета_1: 0,9, бета_2: 0,999, эпсилон: 1,0e-8).Он рассчитывается следующим образом:

double AdamOptimizer::calc(int t, double& m_t, double& v_t, double g_t)
{
    m_t = this->beta_1 * m_t + (1.0 - this->beta_1) * g_t;
    v_t = this->beta_2 * v_t + (1.0 - this->beta_2) * (g_t * g_t);

    double m_t_aver = m_t / (1.0 - std::pow(this->beta_1, t + 1));
    double v_t_aver = v_t / (1.0 - std::pow(this->beta_2, t + 1));

    return -(this->alpha * m_t_aver) / (std::sqrt(v_t_aver) + this->epsilon);
}  

Итак, может ли эта проблема быть вызвана отсутствием некоторых дополнительных методов обучения (отсев, нормализация партии) или неправильно заданными параметрами?Или это вызвано некоторыми проблемами реализации?

PS Я предоставляю ссылку на github , если необходимо.

1 Ответ

0 голосов
/ 18 ноября 2018

Попробуйте уменьшить скорость обучения.

...