Этот пример показывает, как обучить нейронные сети для глубокого обучения с различными инициализаторами веса.
При обучении нейронной сети для глубокого обучения инициализация весов и смещений слоев может оказать большое влияние на то, насколько хорошо сеть обучается. Выбор инициализатора оказывает большее влияние на сети без нормализации партии . слоев.
В зависимости от типа слоя можно изменить веса и инициализацию смещения с помощью 'WeightsInitializer'
, 'InputWeightsInitializer'
, 'RecurrentWeightsInitializer'
, и 'BiasInitializer'
опции.
Этот пример показывает эффект использования этих трех различных инициализаторов веса при обучении сети LSTM:
Инициализатор Glorot - Инициализируйте входные веса с помощью инициализатора Glorot. [1]
Инициализатор - Инициализируйте входные веса с помощью инициализатора He. [2]
Узко-Нормальный Инициализатор - Инициализируйте входные веса путем независимой дискретизации из нормального распределения с нулем среднего и стандартным отклонением 0,01.
Загрузите набор данных японских гласных. XTrain
- массив ячеек, содержащий 270 последовательностей различной длины с размерностью признаков 12. Y
является категориальным вектором меток 1,2,..., 9. Записи в XTrain
являются матрицами с 12 строками (по одной строке для каждой функции) и меняющимся количеством столбцов (по одному столбцу для каждого временного шага).
[XTrain,YTrain] = japaneseVowelsTrainData; [XValidation,YValidation] = japaneseVowelsTestData;
Укажите сетевую архитектуру. Для каждого инициализатора используйте одну и ту же сетевую архитектуру.
Задайте размер входа как 12 (количество функций входных данных). Задает слой LSTM со 100 скрытыми модулями измерения и выводит последний элемент последовательности. Наконец, задайте девять классов, включив полностью соединенный слой размера 9, затем слой softmax и слой классификации.
numFeatures = 12; numHiddenUnits = 100; numClasses = 9; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numClasses) softmaxLayer classificationLayer]
layers = 5x1 Layer array with layers: 1 '' Sequence Input Sequence input with 12 dimensions 2 '' LSTM LSTM with 100 hidden units 3 '' Fully Connected 9 fully connected layer 4 '' Softmax softmax 5 '' Classification Output crossentropyex
Задайте опции обучения. Для каждого инициализатора используйте одни и те же опции обучения для обучения сети.
maxEpochs = 30; miniBatchSize = 27; numObservations = numel(XTrain); numIterationsPerEpoch = floor(numObservations / miniBatchSize); options = trainingOptions('adam', ... 'ExecutionEnvironment','cpu', ... 'MaxEpochs',maxEpochs, ... 'MiniBatchSize',miniBatchSize, ... 'GradientThreshold',2, ... 'ValidationData',{XValidation,YValidation}, ... 'ValidationFrequency',numIterationsPerEpoch, ... 'Verbose',false, ... 'Plots','training-progress');
Задайте сетевую архитектуру, перечисленную ранее в примере, и установите инициализатор входных весов слоя LSTM и инициализатор весов полностью подключенного уровня на 'glorot'
.
layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last','InputWeightsInitializer','glorot') fullyConnectedLayer(numClasses,'WeightsInitializer','glorot') softmaxLayer classificationLayer];
Обучите сеть с помощью слоев с помощью инициализаторов весов Glorot.
[netGlorot,infoGlorot] = trainNetwork(XTrain,YTrain,layers,options);
Задайте сетевую архитектуру, перечисленную ранее в примере, и установите инициализатор входных весов слоя LSTM и инициализатор весов полностью подключенного уровня на 'he'
.
layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last','InputWeightsInitializer','he') fullyConnectedLayer(numClasses,'WeightsInitializer','he') softmaxLayer classificationLayer];
Обучите сеть с помощью слоев с помощью инициализаторов весов He.
[netHe,infoHe] = trainNetwork(XTrain,YTrain,layers,options);
Задайте сетевую архитектуру, перечисленную ранее в примере, и установите инициализатор входных весов слоя LSTM и инициализатор весов полностью подключенного уровня на 'narrow-normal'
.
layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last','InputWeightsInitializer','narrow-normal') fullyConnectedLayer(numClasses,'WeightsInitializer','narrow-normal') softmaxLayer classificationLayer];
Обучите сеть с помощью слоев с узко-нормальными инициализаторами весов.
[netNarrowNormal,infoNarrowNormal] = trainNetwork(XTrain,YTrain,layers,options);
Извлеките точность валидации из информационных структур, выводимых из trainNetwork
функция.
validationAccuracy = [ infoGlorot.ValidationAccuracy; infoHe.ValidationAccuracy; infoNarrowNormal.ValidationAccuracy];
Векторы точности валидации содержат NaN
для итераций, для которых точность валидации не была вычислена. Удалите NaN
значения.
idx = all(isnan(validationAccuracy)); validationAccuracy(:,idx) = [];
Для каждого из инициализаторов постройте график чисел эпохи с точностью валидации.
figure epochs = 0:maxEpochs; plot(epochs,validationAccuracy) title("Validation Accuracy") xlabel("Epoch") ylabel("Validation Accuracy") legend(["Glorot" "He" "Narrow-Normal"],'Location','southeast')
Этот график показывает общий эффект различных инициализаторов и то, как быстро обучение сходится для каждого из них.
Глорот, Ксавьер и Йошуа Бенгио. «Понимание сложности настройки нейронных сетей с глубокой прямой связью». В Трудах тринадцатой международной конференции по искусственному интеллекту и статистике, стр. 249-256. 2010.
Он, Кэйминг, Сянюй Чжан, Шаоцин Жэнь и Цзянь Солнце. «Копаясь глубоко в выпрямителях: Превосходная эффективность человеческого уровня на imagenet классификации». В Трудах международной конференции IEEE по компьютерному зрению, стр. 1026-1034. 2015.
trainingOptions
| trainNetwork