Отредактируйте мелкие свойства нейронной сети

Совет

Чтобы изучить, как задать ваши собственные слои для нейронных сетей для глубокого обучения, смотрите, Задают Пользовательские Слои Глубокого обучения.

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

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

help nnnetwork

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

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

net = network

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

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

Пользовательская сеть

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

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

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

Веса и смещения каждого слоя инициализируются с методом инициализации слоя Нгуена-Видрова (initnw). Сеть обучена с обратной связью Levenberg-Marquardt (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]

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

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

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

Вы могли также задать те связи с одной строкой кода.

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

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

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

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) представляет присутствие связи веса слоя, идущей в ith слой от jth слоя. Соедините слои 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 становится массивом ячеек двух входных структур. Каждая входная структура ith (net.inputs{i}) содержит дополнительные свойства, сопоставленные с входом ith.

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

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 и его функцию инициализации к функции Нгуена-Видрова, как требуется для пользовательского сетевого графика.

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 содержит две выходных структуры, один для слоя 2 и один для слоя 3. Это расположение происходит автоматически, когда net.outputConnect установлен в [0 1 1].

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

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)

size автоматически установлен в 3, когда размер второго слоя (net.layers{2}.size) установлен в то значение. Посмотрите на выходную структуру третьего слоя, если вы хотите проверить, что она также имеет правильный 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 и нажмите Return снова, чтобы видеть следующий набор свойств.

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, функции инициализации Нгуена-Видрова.

net.initFcn = 'initlay';

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

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

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

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

net.divideFcn = 'dividerand';

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

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

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

Вес и значения смещения

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

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} имеет столько же строк сколько размер ith слоя (net.layers{i}.size).

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

Аналогично, каждый вес слоя имеет столько же столбцов сколько размер jth слоя (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, который также верен для показанных значений.

Следующая задача является дополнительной. В некоторых случаях можно хотеть изменить учебные параметры перед обучением. Следующая строка кода отображает параметры обучения Levenberg-Marquardt по умолчанию (заданный, когда вы устанавливаете 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);

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

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

Y = sim(net,X)

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

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