В этом примере показано, как обучить нейронные сети для глубокого обучения с различными инициализаторами веса.
Когда обучение, нейронная сеть для глубокого обучения, инициализация весов слоя и смещения могут оказать большое влияние на то, как хорошо сеть обучается. Выбор инициализатора оказывает большее влияние на сети без слоев нормализации партии.
В зависимости от типа слоя можно изменить веса и сместить инициализацию с помощью 'WeightsInitializer'
, 'InputWeightsInitializer'
, 'RecurrentWeightsInitializer'
, и 'BiasInitializer'
опции.
Этот пример показывает эффект использования этих трех различных инициализаторов веса при обучении сети LSTM:
Инициализатор Glorot – Инициализирует входные веса инициализатором Glorot. [1]
Он Инициализатор – Инициализирует входные веса Им инициализатор. [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];
Обучайтесь сеть с помощью слоев с Ним взвешивает инициализаторы.
[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')
Этот график показывает полный эффект различных инициализаторов и как быстро обучение сходится для каждого.
Glorot, Ксавьер и Иосуа Бенхио. "Изучая трудность учебных глубоких нейронных сетей прямого распространения". В Продолжениях тринадцатой международной конференции по вопросам искусственного интеллекта и статистики, стр 249-256. 2010.
Он, Kaiming, Сянюй Чжан, Шаоцин Жэнь и Цзянь Сунь. "Копаясь глубоко в выпрямителях: Превосходная эффективность человеческого уровня на imagenet классификации". В Продолжениях международной конференции IEEE по вопросам компьютерного зрения, стр 1026-1034. 2015.
trainNetwork
| trainingOptions