Настройте параметры и обучите сверточную нейронную сеть

После того, как вы задаете слои вашей нейронной сети, как описано в Specify Layers of Сверточную Нейронную Сеть, следующим шагом является настройка опций обучения для сети. Используйте trainingOptions функция для определения глобальных параметров обучения. Чтобы обучить сеть, используйте объект, возвращенный trainingOptions как входной параметр к trainNetwork функция. Для примера:

options = trainingOptions('adam');
trainedNet = trainNetwork(data,layers,options);

Слои с настраиваемыми параметрами также имеют опции для настройки параметров обучения. Для получения дополнительной информации см. раздел «Настройка параметров в сверточных и полносвязных слоях».

Задайте решатель и максимальное количество эпох

trainNetwork может использовать различные варианты стохастического градиентного спуска для обучения сети. Задайте алгоритм оптимизации при помощи solverName аргумент trainingOptions. Чтобы минимизировать потери, эти алгоритмы обновляют параметры сети, делая небольшие шаги в направлении отрицательного градиента функции потерь.

The 'adam' (выведенный из оценки адаптивного момента) решатель часто является хорошим оптимизатором, чтобы попробовать сначала. Можно также попробовать 'rmsprop' (среднее корневое квадратное распространение) и 'sgdm' (стохастический градиентный спуск с импульсом) оптимизаторы и увидеть, улучшает ли это обучение. Другие решатели работают лучше для разных задач. Для получения дополнительной информации о других решателях. Stochastic Gradient Descent.

Решатели обновляют параметры, используя подмножество данных каждый шаг. Это подмножество называется мини-пакетом. Размер мини-пакета можно задать при помощи 'MiniBatchSize' Аргумент пары "имя-значение" из trainingOptions. Каждое обновление параметра называется итерацией. Полное прохождение всего набора данных называется эпохой. Можно задать максимальное количество эпох для обучения при помощи 'MaxEpochs' Аргумент пары "имя-значение" из trainingOptions. Значение по умолчанию 30, но можно выбрать меньшее количество эпох для малых сетей или для подстройки и передачи обучения, где большая часть обучения уже выполнена.

По умолчанию программное обеспечение тасует данные один раз перед обучением. Изменить эту настройку можно при помощи 'Shuffle' аргумент пары "имя-значение".

Задайте и измените скорость обучения

Можно задать глобальную скорость обучения при помощи 'InitialLearnRate' Аргумент пары "имя-значение" из trainingOptions. По умолчанию, trainNetwork использует это значение на протяжении всего процесса обучения. Можно принять решение изменить скорость обучения каждое определенное количество эпох путем умножения скорости обучения с фактором. Вместо использования небольшой фиксированной скорости обучения в течение всего процесса обучения можно выбрать большую скорость обучения в начале обучения и постепенно уменьшить это значение во время оптимизации. Это может сократить время обучения, в то же время позволяя меньше шагов к минимуму потерь по мере процессов обучения.

Совет

Если потеря мини-пакета во время обучения когда-либо становится NaN, тогда скорость обуч, вероятно, слишком высок. Попробуйте уменьшить скорость обучения, например, в 3 раза и перезапустить сетевое обучение.

Чтобы постепенно уменьшить скорость обучения, используйте 'LearnRateSchedule','piecewise' аргумент пары "имя-значение". Когда вы выберете эту опцию, trainNetwork умножает начальную скорость обучения на множитель 0,1 каждые 10 эпох. Можно задать коэффициент, которым можно уменьшить начальную скорость обучения и количество эпох при помощи 'LearnRateDropFactor' и 'LearnRateDropPeriod' Аргументы пары "имя-значение", соответственно.

Задайте данные валидации

Чтобы выполнить валидацию сети во время обучения, задайте данные валидации с помощью 'ValidationData' Аргумент пары "имя-значение" из trainingOptions. По умолчанию, trainNetwork проверяет сеть каждые 50 итераций путем предсказания отклика данных валидации и вычисления потерь и точности валидации (корневая средняя квадратичная невязка для регрессионных сетей). Вы можете изменить частоту валидации с помощью 'ValidationFrequency' аргумент пары "имя-значение". Если ваша сеть имеет слои, которые ведут себя по-другому во время предсказания, чем во время обучения (для примера, слоев отсева), то точность валидации может быть выше точности обучения (мини-пакета). Можно также использовать данные валидации, чтобы автоматически остановить обучение, когда потеря валидации прекращает уменьшаться. Чтобы включить автоматическую остановку валидации, используйте 'ValidationPatience' аргумент пары "имя-значение".

Выполнение валидации через регулярные интервалы времени во время обучения помогает вам определить, является ли ваша сеть избыточной для обучающих данных. Общей проблемой является то, что сеть просто «запоминает» обучающие данные, а не изучает общие функции, которые позволяют сети делать точные предсказания для новых данных. Чтобы проверить, является ли ваша сеть избыточной, сравните потери и точность обучения с соответствующими метриками валидации. Если потеря обучения значительно ниже, чем потеря валидации, или точность обучения значительно выше, чем точность валидации, то ваша сеть перегружается.

Чтобы уменьшить сверхподбор кривой, можно попробовать добавить увеличение данных. Использование augmentedImageDatastore для выполнения случайных преобразований на ваших входных изображениях. Это помогает предотвратить запоминание сетью точного положения и ориентации объектов. Можно также попробовать увеличить регуляризацию L2, используя 'L2Regularization' аргумент пары "имя-значение", используя нормализации партии . после сверточных слоев и добавляя слои выпадения.

Выберите аппаратный ресурс

Если графический процессор доступен, тогда trainNetwork использует его для обучения, по умолчанию. В противном случае, trainNetwork использует центральный процессор. Кроме того, можно задать окружение выполнения, которую вы хотите использовать 'ExecutionEnvironment' аргумент пары "имя-значение". Можно задать один центральный процессор ('cpu'), один графический процессор ('gpu'), несколько графических процессоров ('multi-gpu'), или локальный параллельный пул или вычислительный кластер ('parallel'). Все опции кроме 'cpu' Требуется Parallel Computing Toolbox™. Для обучения на графическом процессоре требуется поддерживаемое устройство. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox).

Сохраните сети контрольных точек и возобновите обучение

Deep Learning Toolbox™ позволяет вам сохранять сети как .mat файлы после каждой эпохи во время обучения. Это периодическое сохранение особенно полезна, когда у вас большая сеть или большой набор данных, а обучение занимает много времени. Если обучение по какой-то причине прервано, можно возобновить обучение из последней сохраненной сети контрольных точек. Если хотите trainNetwork чтобы сохранить сети контрольных точек, необходимо задать имя пути при помощи 'CheckpointPath' Аргумент пары "имя-значение" из trainingOptions. Если заданный вами путь не существует, то trainingOptions возвращает ошибку.

trainNetwork автоматически присваивает уникальные имена сетевым файлам контрольных точек. В имени примера net_checkpoint__351__2018_04_12__18_09_52.mat, 351 - число итерации, 2018_04_12 является датой и 18_09_52 - время, в которое trainNetwork сохраняет сеть. Загрузить сетевой файл контрольной точки можно двойным щелчком по нему или с помощью команды load в командной строке. Для примера:

load net_checkpoint__351__2018_04_12__18_09_52.mat
Затем можно возобновить обучение, используя слои сети в качестве входного параметра для trainNetwork. Для примера:

trainNetwork(XTrain,YTrain,net.Layers,options)
Необходимо вручную задать опции обучения и входные данные, поскольку сеть контрольных точек не содержит этой информации. Для получения примера смотрите Возобновить обучение из сети контрольных точек.

Настройка параметров в сверточных и полносвязных слоях

Можно задать параметры обучения, которые отличаются от глобальных значений, заданных в trainingOptions в слоях с настраиваемыми параметрами, таких как сверточные и полносвязные слои. Для примера, чтобы настроить скорость обучения для смещений или весов, можно задать значение для BiasLearnRateFactor или WeightLearnRateFactor свойства слоя, соответственно. trainNetwork функция умножает скорость обучения, которую вы задаете, используя trainingOptions с этими факторами. Точно так же можно задать L2 коэффициенты регуляризации для весов и смещений в этих слоях путем определения BiasL2Factor и WeightL2Factor свойства, соответственно. trainNetwork затем умножает L2 коэффициенты регуляризации, которые вы задаете используя trainingOptions с этими факторами.

Инициализация весов в сверточных и полносвязных слоях

Веса слоев являются настраиваемыми параметрами. Можно задать начальное значение для весов непосредственно с помощью Weights свойство слоя. При обучении сети, если Weights свойство слоя непусто, тогда trainNetwork использует Weights свойство как начальное значение. Если на Weights свойство пустое, тогда trainNetwork использует инициализатор, заданный как WeightsInitializer свойство слоя.

Обучите свою сеть

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

layers = [imageInputLayer([28 28 1])
          convolution2dLayer(5,20)
          reluLayer
          maxPooling2dLayer(2,'Stride',2)
          fullyConnectedLayer(10)
          softmaxLayer
          classificationLayer];
options = trainingOptions('adam');
convnet = trainNetwork(data,layers,options);

Обучающие данные могут быть массивом, таблицей или ImageDatastore объект. Для получения дополнительной информации смотрите trainNetwork страница с описанием функции.

См. также

| | |

Похожие темы