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

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

Когда обучение в Обучается и Применяется, Многоуровневые Мелкие Нейронные сети завершено, можно проверять производительность сети и определить, должны ли какие-либо изменения быть внесены в учебный процесс, сетевую архитектуру или наборы данных. Сначала проверяйте учебную запись, 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: [2 3 5 6 9 10 11 13 14 15 18 19 20 22 23 24 25 29 30 ... ]
          valInd: [1 8 17 21 27 28 34 43 63 71 72 74 75 83 106 124 125 ... ]
         testInd: [4 7 12 16 26 32 37 42 53 60 61 67 69 78 82 87 89 104 ... ]
            stop: 'Training finished: Met validation criterion'
      num_epochs: 9
       trainMask: {[NaN 1 1 NaN 1 1 NaN NaN 1 1 1 NaN 1 1 1 NaN NaN 1 1 ... ]}
         valMask: {[1 NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN ... ]}
        testMask: {[NaN NaN NaN 1 NaN NaN 1 NaN NaN NaN NaN 1 NaN NaN ... ]}
      best_epoch: 3
            goal: 0
          states: {1x8 cell}
           epoch: [0 1 2 3 4 5 6 7 8 9]
            time: [0.0500 0.1219 0.1328 0.1477 0.1618 0.1820 0.1965 ... ]
            perf: [672.2031 94.8128 43.7489 12.3078 9.7063 8.9212 8.0412 ... ]
           vperf: [675.3788 76.9621 74.0752 16.6857 19.9424 23.4096 ... ]
           tperf: [599.2224 97.7009 79.1240 24.1796 31.6290 38.4484 ... ]
              mu: [1.0000e-03 0.0100 0.0100 0.1000 0.1000 0.1000 0.1000 ... ]
        gradient: [2.4114e+03 867.8889 301.7333 142.1049 12.4011 85.0504 ... ]
        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)

Figure Training Record contains an axes object. The axes object with title Performance is 6.3064 contains 4 objects of type line. These objects represent Test, Validation, Train.

Свойство 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')

Figure Regression (plotregression) contains 3 axes objects. Axes object 1 with title Train: R=0.91107 contains 3 objects of type line. These objects represent Y = T, Fit, Data. Axes object 2 with title Validation: R=0.8456 contains 3 objects of type line. These objects represent Y = T, Fit, Data. Axes object 3 with title Testing: R=0.87068 contains 3 objects of type line. These objects represent Y = T, Fit, Data.

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

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

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

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

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

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

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

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