Редактирование свойств неглубокой нейронной сети

Совет

Чтобы узнать, как определить свои собственные слои для нейронных сетей для глубокого обучения, смотрите Define Custom Deep Learning Layers.

Программное обеспечение Deep Learning Toolbox™ обеспечивает гибкий тип объекта сети, который позволяет создавать и затем использовать многие виды сетей с такими функциями, как init, sim, и train.

Введите следующее, чтобы увидеть все функции создания сети в тулбоксе.

help nnnetwork

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

Чтобы создать пользовательские сети, начните с пустой сети (полученной с network function) и установите его свойства по желанию.

net = network

Сетевой объект состоит из многих свойств, которые можно задать, чтобы задать структуру и поведение сети.

В следующих разделах показано, как создать пользовательскую сеть с помощью этих свойств.

Настраиваемая сеть

Прежде чем вы сможете создать сеть, вам нужно знать, как она выглядит. В драматических целях (и дать тулбоксу тренировку) этот раздел ведет вас через создание дикой и сложной сети, показанной ниже.

Каждый из двух элементов первого входа сети должен принимать значения в диапазоне от 0 до 10. Каждый из пяти элементов входного входа второй сети находится в областях значений от − 2 до 2.

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

Веса и смещения каждого слоя инициализируются методом инициализации слоя Nguyen-Widrow (initnw). Сеть обучается с backpropagation Левенберга-Марквардта (trainlm), так что, в данном примере входных векторов, выходы третьего слоя учатся совпадать с соответствующими целевыми векторами с минимальной средней квадратичной невязкой (mse).

Определение сети

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

net = network

Свойства архитектуры

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

Количество входов и слоев.  Первые два свойства, отображаемые в группе размерностей numInputs и numLayers. Эти свойства позволяют вам выбрать, сколько входов и слоев вы хотите иметь в сети.

net =

    dimensions:
         numInputs: 0
         numLayers: 0
         ...

Обратите внимание, что в настоящее время сеть не имеет никаких входов или слоев.

Измените это, установив эти свойства на количество входов и количество слоев в пользовательской схеме сети.

net.numInputs = 2;
net.numLayers = 3;

net.numInputs количество источников входа, а не количество элементов в векторе входа (net.inputs{i}.size).

Смещение соединений.  Тип net и нажмите Enter, чтобы снова просмотреть его свойства. Теперь сеть имеет два входа и три слоя.

net =
    Neural Network:
    dimensions:
         numInputs: 2
         numLayers: 3

Исследуйте следующие четыре свойства в группе соединений:

       biasConnect: [0; 0; 0]
      inputConnect: [0 0; 0 0; 0 0]
      layerConnect: [0 0 0; 0 0 0; 0 0 0]
     outputConnect: [0 0 0]

Эти матрицы 1s и 0s представляют наличие и отсутствие смещения, входного веса, веса слоя и выходных соединений. На данный момент все нули, что указывает на то, что сеть не имеет таких соединений.

Матрица связи смещения является вектором 3 на 1. Чтобы создать соединение смещения с i-м слоем, можно задать net.biasConnect(i) на 1. Укажите, что первый и третий слои должны иметь соединения смещения, как указывает схема, путем ввода следующего кода:

net.biasConnect(1) = 1;
net.biasConnect(3) = 1;

Можно также задать соединения с одной строкой кода.

net.biasConnect = [1; 0; 1];

Входные и слоевые весовые соединения.  Матрица входных соединений является 3 на 2, представляющей наличие соединений от двух источников (два входа) к трем адресатам (три слоя). Таким образом, net.inputConnect(i,j) представляет наличие входного весового соединения, идущего на i-й слой от j-го входа.

Чтобы соединить первый вход с первым и вторым слоями, и второй вход со вторым слоем (как обозначено пользовательской сетевой схемой), введите

net.inputConnect(1,1) = 1;
net.inputConnect(2,1) = 1;
net.inputConnect(2,2) = 1;

или эту одну строку кода:

net.inputConnect = [1 0; 1 1; 0 0];

Точно так же net.layerConnect(i.j) представляет наличие соединения с весом слоя, переходящего на i-й слой из j-го слоя. Соедините слои 1, 2 и 3 с слоем 3 следующим образом:

net.layerConnect = [0 0 0; 0 0 0; 1 1 1];

Выходные соединения.  Выходы соединения являются матрицей 1 на 3, что указывает на то, что они соединяются с одним адресатом (внешний мир) из трех источников (три слоя).

Чтобы соединить слои 2 и 3 с выходным сигналом сети, введите

net.outputConnect = [0 1 1];

Количество выходов

Тип net и нажмите Enter, чтобы просмотреть обновленные свойства. Окончательные три свойства архитектуры являются значениями только для чтения, что означает, что их значения определяются выбором, сделанным для других свойств. Первым свойством, доступным только для чтения, в группе размерностей является количество выходов:

numOutputs: 2

Путем определения выходного соединения из слоев 2 и 3, вы указали, что сеть имеет два выхода.

Свойства подобъекта

Следующая группа свойств в выход отображения является подобъектами:

subobjects:
            inputs: {2x1 cell array of 2 inputs}
            layers: {3x1 cell array of 3 layers}
           outputs: {1x3 cell array of 2 outputs}
            biases: {3x1 cell array of 2 biases}
      inputWeights: {3x2 cell array of 3 weights}
      layerWeights: {3x3 cell array of 3 weights}

Исходные данные

Когда вы устанавливаете количество входов (net.numInputs) к 2, inputs свойство становится массивом ячеек из двух входных структур. Каждая i-я входная структура (net.inputs{i}) содержит дополнительные свойства, сопоставленные с i-ым входом.

Чтобы увидеть, как расположены входные структуры, введите

net.inputs
ans = 
    [1x1 nnetInput]
    [1x1 nnetInput]

Чтобы увидеть свойства, связанные с первым входом, введите

net.inputs{1}

Свойства появляются следующим образом:

ans = 
              name: 'Input'
    feedbackOutput: []
       processFcns: {}
     processParams: {1x0 cell array of 0 params}
   processSettings: {0x0 cell array of 0 settings}
    processedRange: []
     processedSize: 0
             range: []
              size: 0
          userdata: (your custom info)

Если вы задаете exampleInput свойство, range, size, processedSize, и processedRange свойства будут автоматически обновлены, чтобы соответствовать свойствам значения exampleInput.

Установите exampleInput свойство следующим образом:

net.inputs{1}.exampleInput = [0 10 5; 0 3 10];

Если вы снова исследуете структуру первого входа, то увидите, что теперь у него новые значения.

Свойство processFcns можно задать одну или несколько функций обработки. Тип help nnprocess для просмотра списка этих функций.

Установите области значений второго входного вектора от − 2 до 2 для пяти элементов следующим образом:

net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};

Просмотрите новые входные свойства. Вы увидите это processParams, processSettings, processedRange и processedSize все были обновлены, чтобы отразить, что входы будут обрабатываться с помощью removeconstantrows и mapminmax перед передачей сети, когда сеть моделируется или обучается. Свойство processParams содержит параметры по умолчанию для каждой функции обработки. Вы можете изменить эти значения, если хотите. Смотрите страницу с описанием для каждой функции обработки, чтобы узнать больше об их параметрах.

Можно задать размер входа непосредственно, когда никакие функции обработки не используются:

net.inputs{2}.size = 5;

Слои.  Когда вы задаете количество слоев (net.numLayers) к 3, layers свойство становится массивом ячеек трехслойных структур. Введите следующую строку кода, чтобы увидеть свойства, сопоставленные с первым слоем.

net.layers{1}
ans = 
    Neural Network Layer
 
              name: 'Layer'
        dimensions: 0
       distanceFcn: (none)
     distanceParam: (none)
         distances: []
           initFcn: 'initwb'
       netInputFcn: 'netsum'
     netInputParam: (none)
         positions: []
             range: []
              size: 0
       topologyFcn: (none)
       transferFcn: 'purelin'
     transferParam: (none)
          userdata: (your custom info)

Введите следующие три строки кода, чтобы изменить размер первого слоя на 4 нейрона, его передаточную функцию к tansig, и ее функцию инициализации в функцию Nguyen-Widrow, как требуется для пользовательской сетевой схемы.

net.layers{1}.size = 4;
net.layers{1}.transferFcn = 'tansig';
net.layers{1}.initFcn = 'initnw';

Второй слой должен иметь три нейрона, logsig передаточная функция, и будет инициализирована с initnw. Установите свойства второго слоя в требуемые значения следующим образом:

net.layers{2}.size = 3;
net.layers{2}.transferFcn = 'logsig';
net.layers{2}.initFcn = 'initnw';

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

net.layers{3}.initFcn = 'initnw';

Выходы.  Используйте эту строку кода, чтобы увидеть, как outputs свойство организовано:

net.outputs
ans = 
    []    [1x1 nnetOutput]    [1x1 nnetOutput]

Обратите внимание, что outputs содержит две структуры output, одну для слоя 2 и одну для слоя 3. Такое расположение происходит автоматически при net.outputConnect установлено в [0 1 1].

Просмотрите структуру output второго слоя со следующим выражением:

net.outputs{2}
ans = 
    Neural Network Output

              name: 'Output'
     feedbackInput: []
     feedbackDelay: 0
      feedbackMode: 'none'
       processFcns: {}
     processParams: {1x0 cell array of 0 params}
   processSettings: {0x0 cell array of 0 settings}
    processedRange: [3x2 double]
     processedSize: 3
             range: [3x2 double]
              size: 3
          userdata: (your custom info)

The size автоматически устанавливается равным 3, когда размер второго слоя (net.layers{2}.size) устанавливается на это значение. Проверьте структуру output третьего слоя, если вы хотите проверить, что она также имеет правильную size.

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

Подобно свойствам обработки входных параметров, установка exampleOutput свойство автоматически приводит к size, range, processedSize, и processedRange подлежит обновлению. Настройка processFcns в список причин обработки массива ячеек имен функции processParams, processSettings, processedRange подлежит обновлению. Затем можно изменить processParam значений, если вы хотите.

Смещения, входные веса и веса слоев.  Введите следующие команды, чтобы увидеть, как устроены структуры смещения и веса:

net.biases
net.inputWeights
net.layerWeights

Вот результаты набора текста net.biases:

ans = 
    [1x1 nnetBias]
    []
    [1x1 nnetBias]

Каждый содержит структуру, где соответствующие соединения (net.biasConnect, net.inputConnect, и net.layerConnect) содержат 1.

Посмотрите на их структуры с этими строками кода:

net.biases{1}
net.biases{3}
net.inputWeights{1,1}
net.inputWeights{2,1}
net.inputWeights{2,2}
net.layerWeights{3,1}
net.layerWeights{3,2}
net.layerWeights{3,3}

Для примера введите net.biases{1} приводит к следующему выходу:

    initFcn: (none)
      learn: true
   learnFcn: (none)
 learnParam: (none)
       size: 4
   userdata: (your custom info)

Задайте веса линий задержки касания в соответствии с сетевой схемой, установив значения каждого веса delays свойство:

net.inputWeights{2,1}.delays = [0 1];
net.inputWeights{2,2}.delays = 1;
net.layerWeights{3,3}.delays = 1;

Сетевые функции

Тип net и нажмите Возврат еще раз, чтобы увидеть следующий набор свойств.

functions:
      adaptFcn: (none)
    adaptParam: (none)
      derivFcn: 'defaultderiv'
     divideFcn: (none)
   divideParam: (none)
    divideMode: 'sample'
       initFcn: 'initlay'
    performFcn: 'mse'
  performParam: .regularization, .normalization
      plotFcns: {}
    plotParams: {1x0 cell array of 0 params}
      trainFcn: (none)
    trainParam: (none)

Каждое из этих свойств определяет функцию для основной сетевой операции.

Установите функцию инициализации на initlay поэтому сеть инициализирует себя в соответствии с функциями инициализации слоя, уже установленными на initnw, функция инициализации Nguyen-Widrow.

net.initFcn = 'initlay';

Это соответствует требованию инициализации сети.

Установите функцию эффективности на mse (средняя квадратичная невязка) и обучающей функции trainlm (backpropagation Levenberg-Marquardt) для удовлетворения окончательного требования пользовательской сети.

net.performFcn = 'mse';
net.trainFcn = 'trainlm';

Установите значение функции деления dividerand (делите обучающие данные случайным образом).

net.divideFcn = 'dividerand';

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

Установите функции построения графика на plotperform (построение графика обучения, валидация и тестирование эффективности) и plottrainstate (постройте график состояния алгоритма настройки относительно эпох).

net.plotFcns = {'plotperform','plottrainstate'};

Значения веса и смещения

Перед инициализацией и обучением сети введите net и нажмите Возврат, затем посмотрите на вес и смещение группы свойств сети.

weight and bias values:
           IW: {3x2 cell} containing 3 input weight matrices
           LW: {3x3 cell} containing 3 layer weight matrices
            b: {3x1 cell} containing 2 bias vectors

Эти массивы ячеек содержат матрицы веса и векторы смещения в тех же позициях, что и свойства соединения (net.inputConnect, net.layerConnect, net.biasConnect) содержат 1с и свойства подобъекта (net.inputWeights, net.layerWeights, net.biases) содержат структуры.

Оценка каждой из следующих строк кода показывает, что все векторы смещения и матрицы веса установлены в нули.

net.IW{1,1}, net.IW{2,1}, net.IW{2,2}
net.LW{3,1}, net.LW{3,2}, net.LW{3,3}
net.b{1}, net.b{3}

Каждое входное net.IW{i,j} веса, вес слоя net.LW{i,j}, и вектор смещения net.b{i} имеет столько строк, сколько размер i-го слоя (net.layers{i}.size).

Каждое входное net.IW{i,j} веса имеет столько столбцов, сколько размер j-го входа (net.inputs{j}.size) умножается на количество значений его задержки (length(net.inputWeights{i,j}.delays)).

Аналогично, вес каждого слоя имеет столько столбцов, сколько размер j-го слоя (net.layers{j}.size) умножается на количество значений его задержки (length(net.layerWeights{i,j}.delays)).

Поведение сети

Инициализация

Инициализируйте сеть следующей строкой кода:

net = init(net);

Еще раз проверьте смещения и веса сети, чтобы увидеть, как они изменились:

net.IW{1,1}, net.IW{2,1}, net.IW{2,2}
net.LW{3,1}, net.LW{3,2}, net.LW{3,3}
net.b{1}, net.b{3}

Для примера,

net.IW{1,1}
ans =
   -0.3040    0.4703
   -0.5423   -0.1395
    0.5567    0.0604
    0.2667    0.4924

Обучение

Задайте следующий массив ячеек из двух входных векторов (один с двумя элементами, один с пятью) для двух временных шагов (т.е. двух столбцов).

X = {[0; 0] [2; 0.5]; [2; -2; 1; 0; 1] [-1; -1; 1; 0; 1]};

Вы хотите, чтобы сеть реагировала следующими последовательностями-мишенями для второго слоя, который имеет три нейрона, и третий слой с одним нейроном:

T = {[1; 1; 1] [0; 0; 0]; 1 -1};

Перед обучением можно моделировать сеть, чтобы увидеть, является ли реакция исходной сети Y близок к целевому T.

Y = sim(net,X)
Y = 
     [3x1 double]    [3x1 double]
     [      1.7148]    [      2.2726]

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

Следующая задача опциональна. В некоторых случаях вы можете пожелать изменить параметры обучения перед обучением. В следующей строке кода отображаются параметры обучения Левенберга-Марквардта по умолчанию (заданные при установке net.trainFcn кому trainlm).

net.trainParam

Необходимо отобразить следующие свойства.

ans = 
    Show Training Window Feedback   showWindow: true
    Show Command Line Feedback showCommandLine: false
    Command Line Frequency                show: 25
    Maximum Epochs                      epochs: 1000
    Maximum Training Time                 time: Inf
    Performance Goal                      goal: 0
    Minimum Gradient                  min_grad: 1e-07
    Maximum Validation Checks         max_fail: 6
    Mu                                      mu: 0.001
    Mu Decrease Ratio                   mu_dec: 0.1
    Mu Increase Ratio                   mu_inc: 10
    Maximum mu                          mu_max: 10000000000

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

Далее обучите сеть следующим вызовом:

net = train(net,X,T);

Обучение запускает окно обучения нейронной сети. Чтобы открыть графики эффективности и обучения, нажмите кнопки plot.

После обучения можно симулировать сеть, чтобы увидеть, научилась ли она правильно реагировать:

Y = sim(net,X)

     [3x1 double]    [3x1 double]
     [      1.0000]    [     -1.0000]

Выход второй сети (т.е. вторая строка массива ячеек Y), который также является выходом третьего слоя, соответствует целевой последовательности T.