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 внутри. Начните с сети прямого распространения, и затем добавьте соединения обратной связи. Кроме того, выключите изучение в подсети модели объекта управления, поскольку это было уже обучено. Следующий этап обучения обучит только подсеть контроллера.

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'])

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

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

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