В этом примере показано, как обучить, подтвердить и протестировать глубокую нейронную сеть, которая имитирует поведение модели прогнозирующего контроллера для автомобильной вспомогательной системы поддержания маршрута. В примере вы также сравниваете поведение глубокой нейронной сети с поведением исходного контроллера.
Модель прогнозирующего управления (MPC) решает ограниченную задачу квадратичного программирования (QP) оптимизации в реальном времени на основе текущего состояния объекта. Поскольку MPC решает свою задачу оптимизации в разомкнутом контуре, можно потенциально заменить контроллер на глубокую нейронную сеть. Оценка глубокой нейронной сети является более вычислительно эффективной, чем решение задачи QP в реальном времени.
Если обучение сети в достаточной степени проходит пространство состояний для приложения, можно создать разумное приближение поведения контроллера. Затем можно развернуть сеть для приложения управления. Можно также использовать сеть как теплую начальную точку для настройки сети актёра агента обучения с подкреплением. Для получения примера смотрите Train агент 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) м/с
Скорость угла рыскания - Область значений (-60,60) град/с
Боковое отклонение - Область значений (-1,1) м
Относительный угол рыскания - Область значений (-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;
Запустите симуляцию обученной сети и объекта с обратной связью. The 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)