Создайте контроллер образца модели со СКРИПТОМ 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] для некоторого обсуждения этих учебных трудностей.