В этом примере показано, как обучать, проверять и тестировать глубокую нейронную сеть, которая имитирует поведение модельного прогнозирующего контроллера для автомобильной вспомогательной системы поддержания полосы движения. В примере также сравнивается поведение глубокой нейронной сети с поведением исходного контроллера.
Модельный прогностический контроль (MPC) решает проблему оптимизации ограниченного квадратичного программирования (QP) в реальном времени на основе текущего состояния установки. Поскольку MPC решает свою задачу оптимизации разомкнутым контуром, можно потенциально заменить контроллер глубокой нейронной сетью. Оценка глубокой нейронной сети более эффективна с вычислительной точки зрения, чем решение задачи QP в реальном времени.
Если обучение сети достаточно пересекает состояние-пространство для приложения, можно создать разумное приближение поведения контроллера. Затем можно развернуть сеть для приложения управления. Сеть также можно использовать в качестве начальной точки для обучения актерской сети агента обучения усилению. Пример см. в разделе Подготовка агента DDPG с предварительно обученной сетью акторов.
Проектирование контроллера MPC для помощи по поддержанию полосы движения. Для этого сначала создайте динамическую модель транспортного средства.
[sys,Vx] = createModelForMPCImLKA;
Создание и проектирование объекта контроллера MPC mpcobj. Кроме того, создайте mpcstate объект для установки начального состояния контроллера. Для получения подробной информации о конструкции контроллера введите edit createMPCobjImLKA.
[mpcobj,initialState] = createMPCobjImLKA(sys);
Дополнительные сведения о проектировании модельных контроллеров прогнозирования для приложений помощи в сохранении полосы движения см. в разделах Система помощи в сохранении полосы движения с использованием управления прогнозом модели (панель инструментов управления прогнозом модели) и Помощь в сохранении полосы движения с обнаружением полосы движения (панель инструментов управления прогнозом модели).
Загрузить входные данные из 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);
Обучение глубокой нейронной сети прекращается после окончательной итерации.
Потери в обучении и валидации почти одинаковы для каждой мини-партии, что указывает на то, что обученная сеть не подходит.
Убедитесь, что обученная глубокая нейронная сеть возвращает углы поворота, аналогичные управляющим действиям контроллера ПДК, с учетом входных данных теста. Вычислите выходные данные сети с помощью 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;
Выполните моделирование обученной сети и установки по замкнутому контуру. 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 (Панель управления прогнозом модели)