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

Совет

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

Программное обеспечение 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. Чтобы создать связь смещения с 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размер, 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 содержит две структуры 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)

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

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

Подобно обрабатывающим вход свойствам, устанавливая exampleOutput свойство автоматически вызывает sizeОбласть значений, 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} имеет столько же строк сколько размер 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

Обучение

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

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.