В этом примере показано, как инкрементно обновить сеть learnables приложения нейронной сети для глубокого обучения, запускающего в напряжении устройства, такие как Raspberry Pi. Этот пример использует приложение обучения с подкреплением тележки с шестом, чтобы проиллюстрировать:
Обучение агент градиента политики (PG), чтобы сбалансировать систему тележки с шестом, смоделированную в MATLAB®. Первоначально, примите, что агент может сбалансировать систему, порождающую силу в области значений-10N к 10 Н. Для получения дополнительной информации об агентах PG смотрите Агентов Градиента политики (Reinforcement Learning Toolbox).
Генерация кода для обученного агента и развертывание агента на цели Raspberry Pi™.
Переобучение агента в MATLAB®, таким образом, что это может только породить силу-8N к 8 Н.
Обновление настраиваемых параметров развернутого агента, не регенерируя код для сети.
Среда обучения с подкреплением для этого примера является полюсом, присоединенным к неприводимому в движение соединению на тележке, которая проходит лишенная трения дорожка. Цель обучения должна заставить маятник стоять вертикально без падения.
Для этой среды:
Восходящим сбалансированным положением маятника является 0
радианами и нисходящим положением зависания является pi
радианы.
Маятник запускается вертикально с начального угла между –0.05 и 0,05 радианами.
Наблюдения средой являются положением и скоростью тележки, угла маятника и угловой производной маятника.
Эпизод завершает работу, если полюс является больше чем 12 градусами вертикали или если тележка перемещает больше чем 2,4 м от исходного положения.
Вознаграждение +1 предоставлено для каждого временного шага, что полюс остается вертикальным. Штраф –5 применяется, когда маятник падает.
Инициализируйте среду, таким образом, что сигнал действия силы от агента до среды от-10 до 10 Н. Позже, переобучите агента так, чтобы сигнал действия силы варьировался от-8N до 8 Н. Для получения дополнительной информации об этой модели смотрите Загрузку Предопределенные Среды Системы управления (Reinforcement Learning Toolbox).
Создайте предопределенный интерфейс среды для маятника.
env = rlPredefinedEnv("CartPole-Discrete")
env = CartPoleDiscreteAction with properties: Gravity: 9.8000 MassCart: 1 MassPole: 0.1000 Length: 0.5000 MaxForce: 10 Ts: 0.0200 ThetaThresholdRadians: 0.2094 XThreshold: 2.4000 RewardForNotFalling: 1 PenaltyForFalling: -5 State: [4×1 double]
Интерфейс имеет дискретное пространство действий, где агент может применить одно из двух возможных значений силы к тележке, –10 или 10 Н.
Получите информацию о наблюдении и действии из интерфейса среды.
obsInfo = getObservationInfo(env); numObservations = obsInfo.Dimension(1); actInfo = getActionInfo(env);
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агент PG решает который действие взять заданные наблюдения с помощью представления актера. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и один выход (действие). Сеть агента имеет два выходных параметров, которые соответствуют количеству возможных действий. Для получения дополнительной информации о создании представления политики глубокой нейронной сети смотрите, Создают политику и Представления Функции ценности (Reinforcement Learning Toolbox).
actorNetwork = [ featureInputLayer(numObservations,'Normalization','none','Name','state') fullyConnectedLayer(2,'Name','fc') softmaxLayer('Name','actionProb') ];
Задайте опции для представления актера с помощью rlRepresentationOptions
(Reinforcement Learning Toolbox).
actorOpts = rlRepresentationOptions('LearnRate',1e-2,'GradientThreshold',1);
Создайте представление актера с помощью заданной глубокой нейронной сети и опций. Укажите информацию действия и наблюдения для критика, полученного из интерфейса среды. Для получения дополнительной информации смотрите rlStochasticActorRepresentation
(Reinforcement Learning Toolbox).
actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'state'},actorOpts);
Создайте агента с помощью заданного представления актера и опций агента по умолчанию. Для получения дополнительной информации смотрите rlPGAgent
(Reinforcement Learning Toolbox).
agent = rlPGAgent(actor);
Обучите агента PG с помощью следующих технических требований:
Запустите каждый эпизод тренировки для самое большее 1 000 эпизодов с каждым эпизодом, длящимся самое большее 200 временных шагов.
Отобразите прогресс обучения в диалоговом окне Episode Manager (установите Plots
опция), и отключают отображение командной строки (установите Verbose
опция к false
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 195 более чем 100 последовательных эпизодов. На данном этапе агент может сбалансировать маятник в вертикальном положении.
Для получения дополнительной информации смотрите rlTrainingOptions
(Reinforcement Learning Toolbox).
trainOpts = rlTrainingOptions(... 'MaxEpisodes', 1000, ... 'MaxStepsPerEpisode', 200, ... 'Verbose', false, ... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',195,... 'ScoreAveragingWindowLength',100);
Визуализируйте систему тележки с шестом при помощи plot
функция во время обучения или симуляции.
plot(env)
Пример использует предварительно обученного агента от MATLABCartpolePG.mat
Matfile. Чтобы обучить агента, установите doTraining
отметьте к true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainOpts); else % Load the pre-trained agent for the example. load('MATLABCartpolePG.mat','agent'); end
Чтобы сгенерировать MEX-функцию PIL для заданной функции точки входа, создайте объект настройки кода для статической библиотеки и установите режим верификации на 'PIL'. Установите выходной язык на C++. Установите coder.DeepLearningConfig
свойство настройки генерации кода возражает против coder.ARMNEONConfig
объект настройки глубокого обучения.
cfg = coder.config('lib', 'ecoder', true); cfg.VerificationMode = 'PIL'; cfg.TargetLang = 'C++'; dlcfg = coder.DeepLearningConfig('arm-compute'); dlcfg.ArmComputeVersion = '20.02.1'; cfg.DeepLearningConfig = dlcfg;
Используйте Пакет поддержки MATLAB для функции Пакета поддержки Raspberry Pi, raspi
(Пакет поддержки MATLAB для Оборудования Raspberry Pi), чтобы создать связь с Raspberry Pi. Пример ожидает raspi
объектные повторные использования настройки от новой успешной связи до платы Raspberry Pi.
r = raspi;
Создайте coder.Hardware
объект для Raspberry Pi и присоединения это к объекту настройки генерации кода.
hw = coder.hardware('Raspberry Pi');
cfg.Hardware = hw;
Чтобы развернуть обученного агента PG в цель Raspberry Pi™, используйте generatePolicyFunction
Команда (Reinforcement Learning Toolbox), чтобы создать функцию оценки политики, которая выбирает действие на основе заданного наблюдения. Эта команда создает evaluatePolicy.m
файл, который содержит функцию политики и agentData.mat
файл, который содержит обученного агента глубокой нейронной сети.
% generatePolicyFunction(agent)
Для заданного наблюдения функция политики оценивает вероятность для каждого возможного действия с помощью сети агента. Затем функция политики случайным образом выбирает действие на основе этих вероятностей. В сгенерированном evaluatePolicy.m
файл, actionSet
переменная представляет набор возможных действий, которые агент может выполнить и присвоен значение [-10 10], на основе начальных условий. Однако, потому что пример переобучает агента, чтобы породить различную силу, изменить actionSet
быть входом во время выполнения к сгенерированному evaluatePolicy.m
файл.
type('evaluatePolicy.m')
function action1 = evaluatePolicy(observation1, actionSet) %#codegen % Reinforcement Learning Toolbox % Generated on: 24-Jun-2021 11:34:24 % Select action from sampled probabilities probabilities = localEvaluate(observation1); % Normalize the probabilities p = probabilities(:)'/sum(probabilities); % Determine which action to take edges = min([0 cumsum(p)],1); edges(end) = 1; [~,actionIndex] = histc(rand(1,1),edges); %#ok<HISTC> action1 = actionSet(actionIndex); end %% Local Functions function probabilities = localEvaluate(observation1) persistent policy if isempty(policy) policy = coder.loadDeepLearningNetwork('agentData.mat','policy'); end observation1 = observation1(:); observation1 = dlarray(single(observation1),'CB'); probabilities = predict(policy,observation1); probabilities = extractdata(probabilities); end
В этом примере вход наблюдения является четырехэлементным вектором, и вход действия является двухэлементным вектором.
inputData = {ones(4,1), ones(2,1)};
Запустите codegen команду, чтобы сгенерировать исполняемый evaluatePolicy_pil
PIL на серверной платформе.
codegen -config cfg evaluatePolicy -args inputData -report
ArmArchitecture is set to armv7 for Raspberry Pi. Arm Compute Library must be built with the same architecture. Deploying code. This may take a few minutes. ### Connectivity configuration for function 'evaluatePolicy': 'Raspberry Pi' Location of the generated elf : /home/pi/remoteBuildDir_sayan/MATLAB_ws/R2021b/home/sayans/Documents/MATLAB/ExampleManager/sayans.pcuExampleSB/deeplearning_shared-ex30572827/codegen/lib/evaluatePolicy/pil Code generation successful: View report
Загрузите MAT-файл experienceData.mat
. Этот MAT-файл хранит переменные observationData
это содержит демонстрационные наблюдения для агента PG. observationData
содержит 100 наблюдений.
load experienceData;
Запустите сгенерированный исполняемый файл evaluatePolicy_pil
на наборе данных наблюдения.
numActions = size(observationData, 3)-1; actions = zeros(1, numActions); actionSet = [-10; 10]; for iAction = 1:numActions actions(iAction) = evaluatePolicy_pil(observationData(:, 1, iAction), actionSet); end
### Starting application: 'codegen/lib/evaluatePolicy/pil/evaluatePolicy.elf' To terminate execution: clear evaluatePolicy_pil ### Launching application evaluatePolicy.elf...
time = (1:numActions)*env.Ts;
Используйте график визуализировать выходные данные.
figure('Name', 'Cart-Pole System', 'NumberTitle', 'off'); plot(time, actions(:),'b-') ylim(actionSet+[-1; 1]); title("Force Executed to Keep the Cart-Pole System Upright") xlabel("Time (in seconds)") ylabel("Force (in N)")
После развертывания агента примите, что требования к питанию для агента, чтобы смочь прикладывать силы-10N или 10 Н высоки. Одно возможное решение для снижения мощности состоит в том, чтобы переобучить агента так, чтобы это только прикладывало силу или-8N или 8 Н. Чтобы переобучить агента, обновите среду
env.MaxForce = 8;
Получите информацию о действии из интерфейса среды.
actInfo = getActionInfo(env);
Воссоздайте представление актера с помощью той же глубокой нейронной сети как прежде, указав информацию действия и наблюдения для критика.
actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'state'},actorOpts);
Создайте агента с помощью заданного представления актера и опций агента по умолчанию.
agent = rlPGAgent(actor);
Переобучите агента в обновленной среде и извлеките переобученную нейронную сеть из агента.
trainingStats = train(agent,env,trainOpts);
retrainedNet = getModel(getActor(agent));
Используйте coder.regenerateDeepLearningParameters
функция, чтобы регенерировать двоичные файлы, хранящие сеть learnables на основе новых значений тех learnables сети.
codegenDirOnHost = fullfile(pwd, 'codegen/lib/evaluatePolicy');
networkFileNames = coder.regenerateDeepLearningParameters(retrainedNet, codegenDirOnHost)
networkFileNames = 1×2 cell
{'cnn_policy0_0_fc_b.bin'} {'cnn_policy0_0_fc_w.bin'}
coder.regenerateDeepLearningParameters
функция принимает переобученную глубокую нейронную сеть и путь к сетевому файлу информации о параметре, испускаемому во время генерации кода на хосте, и возвращает cellarray файлов, содержащих регенерированную сеть learnables. Обратите внимание на то, что coder.regenerateDeepLearningParameters
может также регенерировать файлы, содержащие сетевые состояния, но для этого примера сеть только имеет learnables. Для того, чтобы обновить развернутую сеть на устройстве Raspberry Pi, эти регенерированные двоичные файлы должны быть скопированы в папку сгенерированного кода на той плате. Используйте raspi.utils.getRemoteBuildDirectory
API, чтобы найти эту директорию. Эта функция перечисляет папки двоичных файлов, которые сгенерированы при помощи codegen.
applicationDirPaths = raspi.utils.getRemoteBuildDirectory('applicationName','evaluatePolicy'); targetDirPath = applicationDirPaths{1}.directory;
Чтобы скопировать регенерированные двоичные файлы, используйте putFile
.
for iFile = 1:numel(networkFileNames) putFile(r, fullfile(codegenDirOnHost, networkFileNames{iFile}), targetDirPath); end
Повторно выполните сгенерированный исполняемый evaluatePolicy_pil
на наборе данных наблюдения.
numActions = size(observationData, 3)-1; actions = zeros(1, numActions); actionSet = [-8; 8]; for iAction = 1:numActions actions(iAction) = evaluatePolicy_pil(observationData(:, 1, iAction), actionSet); end time = (1:numActions)*env.Ts;
Используйте график визуализировать выходные данные.
figure('Name', 'Cart-Pole System', 'NumberTitle', 'off'); plot(time, actions(:),'b-') ylim(actionSet+[-1; 1]); title("Force Executed to Keep the Cart-Pole System Upright") xlabel("Time (in seconds)") ylabel("Force (in N)")
clear evaluatePolicy_pil;
### Host application produced the following standard output (stdout) and standard error (stderr) messages:
coder.regenerateDeepLearningParameters
| coder.DeepLearningConfig
| codegen
| coder.config
| dlarray
(Deep Learning Toolbox) | dlnetwork
(Deep Learning Toolbox)