exponenta event banner

Создайте контроллер эталонной модели со СКРИПТОМ MATLAB

До сих пор эта тема описала методы обучения для нескольких определенной динамической сетевой архитектуры. Однако любая сеть, которая может быть создана в тулбоксе, может быть обучена с помощью учебных функций, описанных в Многоуровневых Мелких Нейронных сетях и Обучении Обратной связи, пока компоненты сети дифференцируемы. В этом разделе приведены пример того, как создать и обучить пользовательскую архитектуру. Пользовательская архитектура, которую вы будете использовать, является системой адаптивного управления моделью - ссылкой (MRAC), которая описана подробно в Нейроконтроллере Модели - ссылки Проекта в Simulink.

Как вы видите в Нейроконтроллере Модели - ссылки Проекта в Simulink, архитектура управления модели - ссылки имеет две подсети. Одна подсеть является моделью объекта, которым вы хотите управлять. Другая подсеть является контроллером. Вы начнете путем обучения сети NARX, которая станет подсетью модели объекта управления. В данном примере вы будете использовать манипулятор, чтобы представлять объект, как описано в Нейроконтроллере Модели - ссылки Проекта в Simulink. Следующий код загрузит данные, собранные от манипулятора, и создаст и обучит сеть NARX. Для этой простой проблемы вы не должны предварительно обрабатывать данные, и все данные могут использоваться для обучения, таким образом, никакое деление данных не необходимо.

[u,y] = robotarm_dataset;
d1 = [1:2];
d2 = [1:2];
S1 = 5;
narx_net = narxnet(d1,d2,S1);
narx_net.divideFcn = '';
narx_net.inputs{1}.processFcns = {};
narx_net.inputs{2}.processFcns = {};
narx_net.outputs{2}.processFcns = {};
narx_net.trainParam.min_grad = 1e-10;
[p,Pi,Ai,t] = preparets(narx_net,u,{},y);
narx_net = train(narx_net,p,t,Pi);
narx_net_closed = closeloop(narx_net);
view(narx_net_closed)

Получившуюся сеть показывают в фигуре.

Теперь, когда модель объекта управления NARX обучена, можно создать общую систему MRAC и вставить модель NARX внутри. Начните с feedforward сети, и затем добавьте связи обратной связи. Кроме того, выключите изучение в подсети модели объекта управления, поскольку это было уже обучено. Следующий этап обучения обучит только подсеть контроллера.

mrac_net = feedforwardnet([S1 1 S1]);
mrac_net.layerConnect = [0 1 0 1;1 0 0 0;0 1 0 1;0 0 1 0];
mrac_net.outputs{4}.feedbackMode = 'closed';
mrac_net.layers{2}.transferFcn = 'purelin';
mrac_net.layerWeights{3,4}.delays = 1:2;
mrac_net.layerWeights{3,2}.delays = 1:2;
mrac_net.layerWeights{3,2}.learn = 0;
mrac_net.layerWeights{3,4}.learn = 0;
mrac_net.layerWeights{4,3}.learn = 0;
mrac_net.biases{3}.learn = 0;
mrac_net.biases{4}.learn = 0;

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

mrac_net.divideFcn = '';
mrac_net.inputs{1}.processFcns = {};
mrac_net.outputs{4}.processFcns = {};
mrac_net.name = 'Model Reference Adaptive Control Network';
mrac_net.layerWeights{1,2}.delays = 1:2;
mrac_net.layerWeights{1,4}.delays = 1:2;
mrac_net.inputWeights{1}.delays = 1:2;

Чтобы сконфигурировать сеть, вам нужны некоторые демонстрационные данные тренировки. Следующий код загружает и отображает данные тренировки на графике и конфигурирует сеть:

[refin,refout] = refmodel_dataset;
ind = 1:length(refin);
plot(ind,cell2mat(refin),ind,cell2mat(refout))
mrac_net = configure(mrac_net,refin,refout);

Вы хотите, чтобы система MRAC с обратной связью ответила таким же образом как эталонная модель, которая использовалась, чтобы сгенерировать эти данные. (См. Использование диспетчер Модели - ссылки Блок для описания эталонной модели.)

Теперь вставьте веса от обученной сети модели объекта управления в соответствующее местоположение системы MRAC.

mrac_net.LW{3,2} = narx_net_closed.IW{1};
mrac_net.LW{3,4} = narx_net_closed.LW{1,2};
mrac_net.b{3} = narx_net_closed.b{1};
mrac_net.LW{4,3} = narx_net_closed.LW{2,1};
mrac_net.b{4} = narx_net_closed.b{2};

Можно установить выходные веса сети контроллера обнулять, который даст объекту начальный вход нуля.

mrac_net.LW{2,1} = zeros(size(mrac_net.LW{2,1}));
mrac_net.b{2} = 0;

Можно также сопоставить любые графики и учебную функцию, которой вы желаете к сети.

mrac_net.plotFcns = {'plotperform','plottrainstate',...
    'ploterrhist','plotregression','plotresponse'};
mrac_net.trainFcn = 'trainlm';

Итоговая сеть MRAC может быть просмотрена со следующей командой:

view(mrac_net)

Слой 3 и слой 4 (вывод) составляют подсеть модели объекта управления. Слой 1 и слой 2 составляют контроллер.

Можно теперь подготовить данные тренировки и обучить сеть.

[x_tot,xi_tot,ai_tot,t_tot] = ...
            preparets(mrac_net,refin,{},refout);
mrac_net.trainParam.epochs = 50;
mrac_net.trainParam.min_grad = 1e-10;
[mrac_net,tr] = train(mrac_net,x_tot,t_tot,xi_tot,ai_tot);

Примечание

Заметьте, что вы используете функцию обучения trainlm здесь, но любая из учебных функций, обсужденных в Многоуровневых Мелких Нейронных сетях и Обучении Обратной связи, могла использоваться также. Любая сеть, которую можно создать в тулбоксе, может быть обучена с любой из тех учебных функций. Единственное ограничение - то, что все части сети должны быть дифференцируемыми.

Вы найдете, что обучение системы MRAC берет намного дольше что обучение модели объекта управления NARX. Это вызвано тем, что сеть является текущей, и динамическая обратная связь должна использоваться. Это определяется автоматически программным обеспечением тулбокса и не требует никакого вмешательства пользователя. Существует несколько реализаций динамической обратной связи (см. [DeHa07]), и программное обеспечение тулбокса автоматически определяет самый эффективный для выбранной сетевой архитектуры и учебного алгоритма.

После того, как сеть была обучена, можно протестировать операцию путем применения тестового воздействия к сети MRAC. Следующий код создает функцию ввода skyline, которая является серией шагов случайной высоты и ширины, и применяет его к обученной сети MRAC.

testin = skyline(1000,50,200,-.7,.7);
testinseq = con2seq(testin);
testoutseq = mrac_net(testinseq);
testout = cell2mat(testoutseq);
figure
plot([testin' testout'])

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

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

Нужно отметить, что текущие сети обычно более трудно обучить, чем feedforward сети. См. [HDH09] для некоторого обсуждения этих учебных трудностей.