Совет
Сведения о том, как определить собственные слои для сетей глубокого обучения, см. в разделе Определение пользовательских слоев глубокого обучения.
Программное обеспечение Deep Learning Toolbox™ предоставляет гибкий тип сетевого объекта, который позволяет создавать и использовать многие виды сетей с такими функциями, как init, sim, и train.
Для просмотра всех функций создания сети на панели инструментов введите следующее.
help nnnetwork
Такая гибкость возможна, поскольку сети имеют объектно-ориентированное представление. Представление позволяет определять различные архитектуры и назначать им различные алгоритмы.
Чтобы создать пользовательские сети, начните с пустой сети (полученной с помощью network функция) и задайте его свойства как требуется.
net = network
Сетевой объект состоит из множества свойств, которые можно задать для определения структуры и поведения сети.
В следующих разделах показано, как создать пользовательскую сеть с помощью этих свойств.
Прежде чем создавать сеть, необходимо знать, как она выглядит. В драматических целях (и чтобы дать инструментарий тренировки) этот раздел ведет вас через создание дикой и сложной сети, показанной ниже.

Каждый из двух элементов первого сетевого входа должен принимать значения в диапазоне от 0 до 10. Каждый из пяти элементов второго сетевого входа находится в диапазоне от − 2 до 2.
Прежде чем завершить проектирование этой сети, необходимо указать алгоритмы, используемые для инициализации и обучения.
Веса и смещения каждого слоя инициализируются методом инициализации слоя Nguyen-Widrow (initnw). Сеть обучается с помощью обратного распространения Левенберга-Марквардта (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 и 0 представляют наличие и отсутствие смещения, входного веса, веса слоя и выходных соединений. В настоящее время они представляют собой нули, указывающие на то, что сеть не имеет таких соединений.
Матрица связи смещения является вектором 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 содержит две структуры вывода, одна для уровня 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, функция инициализации Nguyen-Widrow.
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
Определите следующий массив ячеек из двух входных векторов (один с двумя элементами, один с пятью) для двух временных шагов (т.е. двух столбцов).
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);
Обучение запускает окно обучения нейронной сети. Чтобы открыть графики состояния производительности и обучения, нажмите кнопки графика.
После обучения вы можете смоделировать сеть, чтобы убедиться, что она научилась правильно реагировать:
Y = sim(net,X)
[3x1 double] [3x1 double]
[ 1.0000] [ -1.0000]
Второй сетевой выход (т.е. вторая строка массива ячеек) Y), который также является выходом третьего уровня, соответствует целевой последовательности T.