В этом примере показано, как обучаться, подтвердите и протестируйте глубокую нейронную сеть, которая подражает, поведение прогнозирующего контроллера модели для автомобильного хранения маршрута помогают системе. Это затем сравнивает поведение глубокой нейронной сети с тем из исходного контроллера.
Прогнозирующее управление модели (MPC) решает ограниченную задачу оптимизации квадратичного программирования (QP) в режиме реального времени на основе текущего состояния объекта. Поскольку MPC решает свою задачу оптимизации способом разомкнутого цикла, существует потенциал, чтобы заменить контроллер на обученную глубокую нейронную сеть. Выполнение так является привлекательной опцией, начиная с оценки глубокой нейронной сети может быть более в вычислительном отношении эффективным, чем решение задачи QP в режиме реального времени.
Если обучение сети достаточно пересекает пространство состояний для приложения, можно создать разумное приближение поведения контроллера. Можно затем развернуть сеть для приложения управления или использовать сеть в качестве точки "теплого" запуска для того, чтобы обучить сеть агента агента обучения с подкреплением
Проект контроллер 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 = reshape(shuffledTrainData(:,1:6)',[numObservations 1 1 numTrainDataRows]); trainOutput = reshape(shuffledTrainData(:,9)',[numActions 1 1 numTrainDataRows]); validationInput = reshape(validationData(:,1:6)',[numObservations 1 1 numValidationDataRows]); validationOutput = reshape(validationData(:,9)',[numActions 1 1 numValidationDataRows]); validationCellArray = {validationInput,validationOutput};
Измените данные о тестировании, которые будут использоваться с predict
.
testDataInput = reshape(testData(:,1:6)',[numObservations 1 1 numTestDataRows]); testDataOutput = testData(:,9);
Архитектура глубокой нейронной сети использует следующие типы слоев.
imageInputLayer
входной слой нейронной сети.
fullyConnectedLayer
умножает вход на матрицу веса и затем добавляет вектор смещения.
reluLayer
функция активации нейронной сети.
tanhLayer
ограничивает значение к области значений к [-1,1].
scalingLayer
масштабирует значение к области значений к [-1.04,1.04], подразумевает, что держащийся угол ограничивается быть [-60,60] степени.
regressionLayer
задает функцию потерь нейронной сети.
Создайте глубокую нейронную сеть, которая будет подражать контроллеру MPC после обучения.
imitateMPCNetwork = [ imageInputLayer([numObservations 1 1],'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);
Вычислите среднеквадратическую ошибку между сетевым выходом и данными о тестировании.
testRMSE = sqrt(mean((testDataOutput - predictedTestDataOutput).^2));
fprintf('Test Data RMSE = %d\n', testRMSE);
Test Data RMSE = 3.785926e-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. Состояние транспортного средства и траектории действия управления для контроллера и глубокой нейронной сети тесно выравниваются.