Обучите сеть для прогнозирования временных рядов Используя Deep Network Designer

В этом примере показано, как предсказать данные временных рядов по образованию сеть долгой краткосрочной памяти (LSTM) в Deep Network Designer.

Deep Network Designer позволяет вам в интерактивном режиме создавать и обучать глубокие нейронные сети классификации последовательностей и задачам регрессии.

Чтобы предсказать значения будущих временных шагов последовательности, можно обучить сеть LSTM регрессии от последовательности к последовательности, где ответы являются обучающими последовательностями со значениями, переключенными одним временным шагом. Таким образом, на каждом временном шаге входной последовательности сеть LSTM учится предсказывать значение следующего временного шага.

Этот пример использует набор данных chickenpox_dataset. Пример создает и обучает сеть LSTM, чтобы предсказать количество случаев ветрянки, учитывая количество случаев в предыдущих месяцах.

Загрузите данные о последовательности

Загрузите данные в качестве примера. chickenpox_dataset содержит одни временные ряды, с временными шагами, соответствующими месяцам и значениям, соответствующим количеству случаев. Выход является массивом ячеек, где каждым элементом является один временной шаг. Измените данные, чтобы быть вектором-строкой.

data = chickenpox_dataset;
data = [data{:}];

figure
plot(data)
xlabel("Month")
ylabel("Cases")
title("Monthly Cases of Chickenpox")

Разделите обучение и тестовые данные. Обучайтесь на первых 90% последовательности и теста на последних 10%.

numTimeStepsTrain = floor(0.9*numel(data))
numTimeStepsTrain = 448
dataTrain = data(1:numTimeStepsTrain+1);
dataTest = data(numTimeStepsTrain+1:end);

Стандартизируйте данные

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

mu = mean(dataTrain);
sig = std(dataTrain);

dataTrainStandardized = (dataTrain - mu) / sig;

Подготовьте предикторы и ответы

Чтобы предсказать значения будущих временных шагов последовательности, задайте ответы как обучающие последовательности со значениями, переключенными одним временным шагом. Таким образом, на каждом временном шаге входной последовательности сеть LSTM учится предсказывать значение следующего временного шага. Предикторы являются обучающими последовательностями без итогового временного шага.

XTrain = dataTrainStandardized(1:end-1);
YTrain = dataTrainStandardized(2:end);

Чтобы обучить сеть с помощью Deep Network Designer, преобразуйте обучающие данные в объект datastore. Используйте arrayDatastore преобразовывать предикторы обучающих данных и ответы в ArrayDatastore объекты. Используйте combine объединить эти два хранилища данных.

adsXTrain = arrayDatastore(XTrain);
adsYTrain = arrayDatastore(YTrain);

cdsTrain = combine(adsXTrain,adsYTrain);

Задайте сетевую архитектуру LSTM

Чтобы создать архитектуру сети LSTM, используйте Deep Network Designer. Приложение Deep Network Designer позволяет вам создать, визуализировать, отредактировать и обучить нейронные сети для глубокого обучения.

deepNetworkDesigner

На начальной странице Deep Network Designer сделайте паузу на От последовательности к последовательности и нажмите Open. Выполнение так открывает предварительно созданную сеть, подходящую для задач классификации от последовательности к последовательности. Можно преобразовать сеть классификации в сеть регрессии, заменив последние слои.

Удалите softmax слой и слой классификации и замените их на слой регрессии.

Настройте свойства слоев так, чтобы они подошли для набора данных ветрянки. Эти данные имеют одну входную функцию и одну выходную функцию. Выберите sequenceInputLayer и установите InputSize на 1. Выберите fullyConnectedLayer и установите OutputSize на 1.

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

Импортируйте данные

Чтобы импортировать учебный datastore, выберите вкладку Data и нажмите Import Data> Import Datastore. Выберите cdsTrain как обучающие данные и None как данные о валидации. Нажмите Import.

Предварительный просмотр данных показывает одни входные временные ряды и один ряд времени отклика, каждого с 448 временными шагами.

Задайте опции обучения

На вкладке Training нажмите Training Options. Установите Решатель на adam, InitialLearnRate к 0.005, и MaxEpochs к 500. Чтобы препятствовать тому, чтобы градиенты взорвались, установите GradientThreshold на 1.

Для получения дополнительной информации об установке опций обучения, смотрите trainingOptions.

Обучение сети

Нажмите Train.

Deep Network Designer отображает анимированный график, показывающий процесс обучения. График показывает мини-пакетную потерю и точность, потерю валидации и точность и дополнительную информацию о процессе обучения.

Если обучение завершено, экспортируйте обучивший сеть путем нажатия на Export во вкладке Training. Обучивший сеть сохранен как trainedNetwork_1 переменная.

Предскажите будущие временные шаги

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

Стандартизируйте тестовые данные с помощью тех же параметров в качестве обучающих данных.

dataTestStandardized = (dataTest - mu) / sig;

XTest = dataTestStandardized(1:end-1);
YTest = dataTest(2:end);

Чтобы инициализировать сетевое состояние, сначала предскажите на обучающих данных XTrain. Затем сделайте первое предсказание с помощью последнего временного шага учебного ответа YTrain(end). Цикл по остающимся предсказаниям и входу предыдущее предсказание к predictAndUpdateState.

Для большого количества данных, длинных последовательностей или больших сетей, предсказания на графическом процессоре обычно быстрее, чтобы вычислить, чем предсказания на центральном процессоре. В противном случае предсказания на центральном процессоре обычно быстрее, чтобы вычислить. Для одного предсказаний временного шага используйте центральный процессор. Чтобы использовать центральный процессор для предсказания, установите 'ExecutionEnvironment' опция predictAndUpdateState к 'cpu'.

net = predictAndUpdateState(trainedNetwork_1,XTrain);

[net,YPred] = predictAndUpdateState(net,YTrain(end));

numTimeStepsTest = numel(XTest);
for i = 2:numTimeStepsTest
    [net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i-1),'ExecutionEnvironment','cpu');
end

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

YPred = sig*YPred + mu;

График процесса обучения сообщает о среднеквадратичной ошибке (RMSE), вычисленной из стандартизированных данных. Вычислите RMSE из нестандартизированных предсказаний.

rmse = sqrt(mean((YPred-YTest).^2))
rmse = single
    175.9693

Постройте учебные временные ряды с предсказанными значениями.

figure
plot(dataTrain(1:end-1))
hold on
idx = numTimeStepsTrain:(numTimeStepsTrain+numTimeStepsTest);
plot(idx,[data(numTimeStepsTrain) YPred],'.-')
hold off
xlabel("Month")
ylabel("Cases")
title("Forecast")
legend(["Observed" "Forecast"])

Сравните предсказанные значения с тестовыми данными.

figure
subplot(2,1,1)
plot(YTest)
hold on
plot(YPred,'.-')
hold off
legend(["Observed" "Forecast"])
ylabel("Cases")
title("Forecast")

subplot(2,1,2)
stem(YPred - YTest)
xlabel("Month")
ylabel("Error")
title("RMSE = " + rmse)

Обновите сетевое состояние с наблюдаемыми величинами

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

Во-первых, инициализируйте сетевое состояние. Чтобы сделать предсказания на новой последовательности, сбросьте сетевое состояние с помощью resetState. Сброс сетевого состояния препятствует тому, чтобы предыдущие предсказания влияли на предсказания на новых данных. Сбросьте сетевое состояние, и затем инициализируйте сетевое состояние путем предсказания на обучающих данных.

net = resetState(net);
net = predictAndUpdateState(net,XTrain);

Предскажите на каждом временном шаге. Для каждого предсказания предскажите следующий временной шаг с помощью наблюдаемой величины предыдущего временного шага. Установите 'ExecutionEnvironment' опция predictAndUpdateState к 'cpu'.

YPred = [];
numTimeStepsTest = numel(XTest);
for i = 1:numTimeStepsTest
    [net,YPred(:,i)] = predictAndUpdateState(net,XTest(:,i),'ExecutionEnvironment','cpu');
end

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

YPred = sig*YPred + mu;

Вычислите среднеквадратичную ошибку (RMSE).

rmse = sqrt(mean((YPred-YTest).^2))
rmse = 119.5968

Сравните предсказанные значения с тестовыми данными.

figure
subplot(2,1,1)
plot(YTest)
hold on
plot(YPred,'.-')
hold off
legend(["Observed" "Predicted"])
ylabel("Cases")
title("Forecast with Updates")

subplot(2,1,2)
stem(YPred - YTest)
xlabel("Month")
ylabel("Error")
title("RMSE = " + rmse)

Здесь, предсказания более точны при обновлении сетевого состояния с наблюдаемыми величинами вместо ожидаемых значений.

Смотрите также

Похожие темы