Чтобы изучить, как задать ваши собственные слои для нейронных сетей для глубокого обучения, смотрите, Задают Пользовательские Слои Глубокого обучения.
Программное обеспечение 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
.