Обновление постгенерации кода параметров нейронной сети для глубокого обучения

В этом примере показано, как инкрементно обновить сеть learnables приложения нейронной сети для глубокого обучения, запускающего в напряжении устройства, такие как Raspberry Pi. Этот пример использует приложение обучения с подкреплением тележки с шестом, чтобы проиллюстрировать:

  1. Обучение агент градиента политики (PG), чтобы сбалансировать систему тележки с шестом, смоделированную в MATLAB®. Первоначально, примите, что агент может сбалансировать систему, порождающую силу в области значений-10N к 10 Н. Для получения дополнительной информации об агентах PG смотрите Агентов Градиента политики (Reinforcement Learning Toolbox).

  2. Генерация кода для обученного агента и развертывание агента на цели Raspberry Pi™.

  3. Переобучение агента в MATLAB®, таким образом, что это может только породить силу-8N к 8 Н.

  4. Обновление настраиваемых параметров развернутого агента, не регенерируя код для сети.

Среда MATLAB тележки с шестом

Среда обучения с подкреплением для этого примера является полюсом, присоединенным к неприводимому в движение соединению на тележке, которая проходит лишенная трения дорожка. Цель обучения должна заставить маятник стоять вертикально без падения.

Для этой среды:

  • Восходящим сбалансированным положением маятника является 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

Агент 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

Обучите агента 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

Сгенерируйте исполняемый файл PIL для развертывания

Чтобы сгенерировать 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;

Сгенерируйте MEX-функцию PIL для развертывания Агента PG

Чтобы развернуть обученного агента 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

Запустите сгенерированный PIL Execuatble на тестовых данных

Загрузите 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)")

Переобучите агента PG

После развертывания агента примите, что требования к питанию для агента, чтобы смочь прикладывать силы-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));

Обновите развернутого агента PG на Raspberry Pi

Используйте 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

Запустите исполняемую программу на Raspberry Pi

Повторно выполните сгенерированный исполняемый 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;

Постройте меры, принятые агентом PG

Используйте график визуализировать выходные данные.

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)")

Очистите PIL

clear evaluatePolicy_pil;
### Host application produced the following standard output (stdout) and standard error (stderr) messages:

Смотрите также

| | | | (Deep Learning Toolbox) | (Deep Learning Toolbox)

Связанные примеры

Больше о