Анализируйте мелкую производительность нейронной сети после обучения

Эта тема представляет часть типичного мелкого рабочего процесса нейронной сети. Для получения дополнительной информации и другие шаги, смотрите Многоуровневые Мелкие Нейронные сети и Обучение Обратной связи. Чтобы узнать о том, как контролировать процесс обучения глубокого обучения, смотрите Процесс обучения Глубокого обучения Монитора.

Когда обучение в Обучается и Применяется, Многоуровневые Мелкие Нейронные сети завершено, можно проверять производительность сети и определить, должны ли какие-либо изменения быть внесены в учебный процесс, сетевую архитектуру или наборы данных. Сначала проверяйте учебную запись, tr, который был вторым аргументом, возвращенным в учебную функцию.

tr
tr = struct with fields:
        trainFcn: 'trainlm'
      trainParam: [1x1 struct]
      performFcn: 'mse'
    performParam: [1x1 struct]
        derivFcn: 'defaultderiv'
       divideFcn: 'dividerand'
      divideMode: 'sample'
     divideParam: [1x1 struct]
        trainInd: [1x176 double]
          valInd: [1x38 double]
         testInd: [1x38 double]
            stop: 'Validation stop.'
      num_epochs: 9
       trainMask: {[1x252 double]}
         valMask: {[1x252 double]}
        testMask: {[1x252 double]}
      best_epoch: 3
            goal: 0
          states: {1x8 cell}
           epoch: [0 1 2 3 4 5 6 7 8 9]
            time: [1x10 double]
            perf: [1x10 double]
           vperf: [1x10 double]
           tperf: [1x10 double]
              mu: [1x10 double]
        gradient: [1x10 double]
        val_fail: [0 0 0 0 1 2 3 4 5 6]
       best_perf: 12.3078
      best_vperf: 16.6857
      best_tperf: 24.1796

Эта структура содержит всю информацию относительно обучения сети. Например, tr.trainInd, tr.valInd и tr.testInd содержите индексы точек данных, которые использовались в обучении, валидации и наборах тестов, соответственно. Если вы хотите переобучить сеть с помощью того же деления данных, можно установить net.divideFcn к 'divideInd', net.divideParam.trainInd к tr.trainInd, net.divideParam.valInd к tr.valInd, net.divideParam.testInd к tr.testInd.

tr структура также отслеживает несколько переменных в ходе обучения, таких как значение функции производительности, величина градиента, и т.д. Можно использовать учебную запись, чтобы построить прогресс производительности при помощи plotperf команда:

plotperf(tr)

Свойство tr.best_epoch указывает на итерацию, в которой производительность валидации достигла минимума. Обучение продолжено для еще 6 итераций перед остановленным обучением.

Этот рисунок не указывает ни на какие основные проблемы с обучением. Валидация и тестовые кривые очень похожи. Если тестовая кривая увеличилась значительно перед увеличенной кривой валидации, то возможно, что некоторая сверхподходящая сила произошла.

Следующий шаг в проверке сети должен создать график регрессии, который показывает отношение между выходными параметрами сети и целей. Если бы обучение было совершенно, сетевые выходные параметры и цели были бы точно равны, но отношение редко совершенно на практике. Для примера жировой прослойки мы можем создать график регрессии со следующими командами. Первая команда вычисляет обучивший сеть ответ на все входные параметры в наборе данных. Следующие шесть команд извлекают выходные параметры и цели, которые принадлежат обучению, валидации и тестируют подмножества. Итоговая команда создает три графика регрессии для обучения, тестирования и валидации.

bodyfatOutputs = net(bodyfatInputs);
trOut = bodyfatOutputs(tr.trainInd);
vOut = bodyfatOutputs(tr.valInd);
tsOut = bodyfatOutputs(tr.testInd);
trTarg = bodyfatTargets(tr.trainInd);
vTarg = bodyfatTargets(tr.valInd);
tsTarg = bodyfatTargets(tr.testInd);
plotregression(trTarg, trOut, 'Train', vTarg, vOut, 'Validation', tsTarg, tsOut, 'Testing')

Три графика представляют обучение, валидацию и данные о тестировании. Пунктирная линия в каждом графике представляет совершенный результат – выходные параметры = цели. Сплошная линия представляет лучшую подходящую линию линейной регрессии между выходными параметрами и целями. Значение R является индикацией относительно отношения между выходными параметрами и целями. Если R = 1, это указывает, что существует точное линейное соотношение между выходными параметрами и целями. Если R близко к нулю, то нет никакого линейного соотношения между выходными параметрами и целями.

В данном примере обучающие данные указывают на хорошую подгонку. Валидация и результаты испытаний также показывают большие значения R. График рассеивания полезен в показе, что у определенных точек данных случаются плохие судороги. Например, существует точка данных в наборе тестов, сетевой выход которого близко к 35, в то время как соответствующее целевое значение - приблизительно 12. Следующий шаг должен был бы исследовать эту точку данных, чтобы определить, представляет ли это экстраполяцию (т.е. он за пределами обучающего набора данных). Если так, затем это должно быть включено в набор обучающих данных, и дополнительные данные должны быть собраны, чтобы использоваться в наборе тестов.

Улучшение результатов

Если сеть не достаточно точна, можно попытаться инициализировать сеть и обучение снова. Каждый раз ваш инициализировать сеть feedforward, сетевые параметры отличаются и могут произвести различные решения.

net = init(net);
net = train(net, bodyfatInputs, bodyfatTargets);

Как второй подход, можно увеличить число скрытых нейронов выше 20. Большее число нейронов в скрытом слое дает сети больше гибкости, потому что сеть имеет больше параметров, которые это может оптимизировать. (Увеличивайте размер слоя постепенно. Если вы делаете скрытый слой слишком большим, вы можете вызвать проблему быть под - охарактеризованы, и сеть должна оптимизировать больше параметров, чем существуют векторы данных, чтобы ограничить эти параметры.)

Третья опция должна попробовать различную учебную функцию. Байесово обучение регуляризации с trainbr, например, может иногда производить лучшую возможность обобщения, чем использование ранней остановки.

Наконец, попытайтесь использовать дополнительные обучающие данные. Обеспечение дополнительных данных для сети, более вероятно, произведет сеть, которая делает вывод хорошо к новым данным.