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