В этом примере показано, как обучаться, подтвердите и протестируйте глубокую нейронную сеть, которая подражает, поведение прогнозирующего контроллера модели для автомобильного хранения маршрута помогают системе. В примере вы также сравниваете поведение глубокой нейронной сети с тем из исходного контроллера.
Прогнозирующее управление модели (MPC) решает ограниченную задачу оптимизации квадратичного программирования (QP) в режиме реального времени на основе текущего состояния объекта. Поскольку MPC решает свою задачу оптимизации способом разомкнутого контура, можно потенциально заменить контроллер на глубокую нейронную сеть. Оценка глубокой нейронной сети более в вычислительном отношении эффективна, чем решение задачи QP в режиме реального времени.
Если обучение сети достаточно пересекает пространство состояний для приложения, можно создать разумное приближение поведения контроллера. Можно затем развернуть сеть для приложения управления. Можно также использовать сеть в качестве точки "теплого" запуска для того, чтобы обучить сеть агента агента обучения с подкреплением. Для примера смотрите, Обучают Агента DDPG с Предварительно обученной Сетью Агента (Reinforcement Learning Toolbox).
Проект контроллер MPC для хранения маршрута помогает. Для этого сначала создайте динамическую модель для транспортного средства.
[sys,Vx] = createModelForMPCImLKA;
Создайте и спроектируйте контроллер MPC объект mpcobj
. Кроме того, создайте mpcstate
объект для установки начального состояния контроллера. Для получения дополнительной информации на проектировании контроллера, введите edit createMPCobjImLKA
.
[mpcobj,initialState] = createMPCobjImLKA(sys);
Для получения дополнительной информации о разработке прогнозирующих контроллеров модели для хранения маршрута помогают приложениям, видят, что Маршрут Сохранить Помогает Системе Используя Прогнозирующее Управление Модели (Model Predictive Control Toolbox), и Хранение Маршрута Помогают с Обнаружением Маршрута (Model Predictive Control Toolbox).
Загрузите входные данные от InputDataFileImLKA.mat
. Столбцы набора данных следуют:
Поперечная скорость
Угловой уровень рыскания
Боковое отклонение
Относительный угол рыскания
Предыдущий руководящий угол (контрольная переменная)
Измеренное воздействие (дорожный уровень рыскания: продольная скорость * искривление ())
Значение функции стоимости
Итерации MPC
Регулирование угла, вычисленного контроллером MPC:
Данные в InputDataFileImLKA.mat
был создан путем вычисления действия MPC управления для случайным образом сгенерированных состояний, предыдущих действий управления и измеренных воздействий. Чтобы сгенерировать ваши собственные обучающие данные, используйте collectDataImLKA
функция.
Загрузите входные данные.
dataStruct = load('InputDataFileImLKA.mat');
data = dataStruct.Data;
Разделите входные данные на обучение, валидацию и данные о тестировании. Во-первых, определите количество строк данных о валидации на основе данного процента.
totalRows = size(data,1); validationSplitPercent = 0.1; numValidationDataRows = floor(validationSplitPercent*totalRows);
Определите количество строк тестовых данных на основе данного процента.
testSplitPercent = 0.05; numTestDataRows = floor(testSplitPercent*totalRows);
Случайным образом извлеките данные о валидации и тестировании из набора входных данных. Для этого сначала случайным образом извлеките достаточно строк для обоих наборов данных.
randomIdx = randperm(totalRows,numValidationDataRows + numTestDataRows); randomData = data(randomIdx,:);
Разделите случайные данные на данные о валидации и тестировании.
validationData = randomData(1:numValidationDataRows,:); testData = randomData(numValidationDataRows + 1:end,:);
Извлеките остающиеся строки как обучающие данные.
trainDataIdx = setdiff(1:totalRows,randomIdx); trainData = data(trainDataIdx,:);
Рандомизируйте обучающие данные.
numTrainDataRows = size(trainData,1); shuffleIdx = randperm(numTrainDataRows); shuffledTrainData = trainData(shuffleIdx,:);
Измените данные об обучении и валидации в 4-D матрицы для использования с trainNetwork
.
numObservations = 6; numActions = 1; trainInput = shuffledTrainData(:,1:6); trainOutput = shuffledTrainData(:,9); validationInput = validationData(:,1:6); validationOutput = validationData(:,9); validationCellArray = {validationInput,validationOutput};
Измените данные о тестировании для использования с predict
.
testDataInput = testData(:,1:6); testDataOutput = testData(:,9);
Архитектура глубоких нейронных сетей использует следующие слои.
imageInputLayer
входной слой нейронной сети.
fullyConnectedLayer
умножает вход на матрицу веса и затем добавляет вектор смещения.
reluLayer
функция активации нейронной сети.
tanhLayer
ограничивает значение к области значений к [-1,1].
scalingLayer
масштабирует значение к области значений к [-1.04,1.04], подразумевает, что держащийся угол ограничивается быть [-60,60] степени.
regressionLayer
задает функцию потерь нейронной сети.
Создайте глубокую нейронную сеть, которая будет подражать контроллеру MPC после обучения.
imitateMPCNetwork = [ featureInputLayer(numObservations,'Normalization','none','Name','InputLayer') fullyConnectedLayer(45,'Name','Fc1') reluLayer('Name','Relu1') fullyConnectedLayer(45,'Name','Fc2') reluLayer('Name','Relu2') fullyConnectedLayer(45,'Name','Fc3') reluLayer('Name','Relu3') fullyConnectedLayer(numActions,'Name','OutputLayer') tanhLayer('Name','Tanh1') scalingLayer('Name','Scale1','Scale',1.04) regressionLayer('Name','RegressionOutput') ];
Постройте сеть.
plot(layerGraph(imitateMPCNetwork))
Задайте опции обучения.
options = trainingOptions('adam', ... 'Verbose',false, ... 'Plots','training-progress', ... 'Shuffle','every-epoch', ... 'MaxEpochs', 30, ... 'MiniBatchSize',512, ... 'ValidationData',validationCellArray, ... 'InitialLearnRate',1e-3, ... 'GradientThresholdMethod','absolute-value', ... 'ExecutionEnvironment','cpu', ... 'GradientThreshold',10, ... 'Epsilon',1e-8);
Обучите глубокую нейронную сеть. Чтобы просмотреть подробную учебную информацию в Командном окне, установите 'Verbose'
опция обучения к true
.
imitateMPCNetObj = trainNetwork(trainInput,trainOutput,imitateMPCNetwork,options);
Обучение остановок глубокой нейронной сети после итоговой итерации.
Потеря обучения и валидации является почти тем же самым для каждого мини-пакета, который указывает, что обучивший сеть не сверхсоответствует.
Проверяйте, что обученная глубокая нейронная сеть возвращает держащиеся углы, похожие на контроллер MPC действия управления, учитывая данные о тестовом воздействии. Вычислите сетевой выход с помощью predict
функция.
predictedTestDataOutput = predict(imitateMPCNetObj,testDataInput);
Вычислите среднеквадратическую ошибку (RMSE) между сетевым выходом и данными о тестировании.
testRMSE = sqrt(mean((testDataOutput - predictedTestDataOutput).^2));
fprintf('Test Data RMSE = %d\n', testRMSE);
Test Data RMSE = 3.578066e-02
Маленькое значение RMSE указывает, что сетевые выходные параметры тесно воспроизводят контроллеры выход MPC.
Чтобы сравнить эффективность контроллера MPC и обученной глубокой нейронной сети, запустите симуляции с обратной связью с помощью модели объекта управления транспортного средства.
Сгенерируйте случайные начальные условия для транспортного средства, которые не являются частью исходного набора входных данных со значениями, выбранными из следующих областей значений:
Поперечная скорость — Область значений (-2,2) m/s
Угловой уровень рыскания — Область значений (-60,60) градус/с
Боковое отклонение — Область значений (-1,1) m
Относительный угол рыскания — Область значений (-45,45) градус
В последний раз регулирование угла (контрольная переменная) — Область значений (-60,60) градус
Измеренное воздействие (дорожный уровень рыскания, заданный как продольная скорость * искривление ()) — Область значений (-0.01,0.01) с минимальным дорожным радиусом 100 м
rng(5e7) [x0,u0,rho] = generateRandomDataImLKA(data);
Установите начальное состояние объекта и управляйте действием в mpcstate
объект.
initialState.Plant = x0; initialState.LastMove = u0;
Извлеките шаг расчета от диспетчера MPC. Кроме того, определите номер шагов симуляции.
Ts = mpcobj.Ts; Tsteps = 30;
Получите A
и B
матрицы пространства состояний для модели транспортного средства.
A = sys.A; B = sys.B;
Инициализируйте состояние и введите траектории для контроллера MPC симуляция.
xHistoryMPC = repmat(x0',Tsteps+1,1); uHistoryMPC = repmat(u0',Tsteps,1);
Запустите симуляцию с обратной связью контроллера MPC и объекта с помощью mpcmove
функция.
for k = 1:Tsteps % Obtain plant output measurements, which correspond to the plant outputs. xk = xHistoryMPC(k,:)'; % Compute the next cotnrol action using the MPC controller. uk = mpcmove(mpcobj,initialState,xk,zeros(1,4),Vx*rho); % Store the control action. uHistoryMPC(k,:) = uk; % Update the state using the control action. xHistoryMPC(k+1,:) = (A*xk + B*[uk;Vx*rho])'; end
Инициализируйте состояние и введите траектории для симуляции глубокой нейронной сети.
xHistoryDNN = repmat(x0',Tsteps+1,1); uHistoryDNN = repmat(u0',Tsteps,1); lastMV = u0;
Запустите симуляцию с обратной связью обучившего сеть и объекта. neuralnetLKAmove
функция вычисляет глубокую нейронную сеть выход с помощью predict
функция.
for k = 1:Tsteps % Obtain plant output measurements, which correspond to the plant outputs. xk = xHistoryDNN(k,:)'; % Predict the next move using the trained deep neural network. uk = neuralnetLKAmove(imitateMPCNetObj,xk,lastMV,rho); % Store the control action and update the last MV for the next step. uHistoryDNN(k,:) = uk; lastMV = uk; % Update the state using the control action. xHistoryDNN(k+1,:) = (A*xk + B*[uk;Vx*rho])'; end
Постройте результаты и сравните контроллер MPC и обученные траектории глубокой нейронной сети (DNN).
plotValidationResultsImLKA(Ts,xHistoryDNN,uHistoryDNN,xHistoryMPC,uHistoryMPC);
Глубокая нейронная сеть успешно подражает поведению контроллера MPC. Состояние транспортного средства и траектории действия управления для контроллера и глубокой нейронной сети практически ориентированы.
predict
| trainNetwork
| mpcmove
(Model Predictive Control Toolbox)