编辑浅神经网络属性
提示
若要了解如何为深度学习网络定义自己的层,请参见定义自定义深度学习层.
深度学习工具箱™软件提供了一个灵活的网络对象类型,允许多种类型的网络被创建,然后使用功能,如初始化
,sim卡
,火车
.
键入以下内容以查看工具箱中的所有网络创建函数。
帮助nnnetwork
这种灵活性是可能的,因为网络有面向对象的表示。这种表示法允许您定义各种体系结构,并为这些体系结构分配各种算法。
要创建自定义网络,请从一个空网络(使用网络
函数)并按需要设置其属性。
网络
network对象由许多属性组成,您可以设置这些属性来指定网络的结构和行为。
下面几节将展示如何使用这些属性创建自定义网络。
自定义网络
在你建立一个网络之前,你需要知道它是什么样子的。出于戏剧性的目的(也为了给工具箱一个练习),本节将带领您创建如下所示的复杂网络。
第一个网络输入的两个元素中的每一个都接受0到10之间的值。第二个网络输入的五个元素中的每一个都在−2到2之间。
在完成该网络的设计之前,必须指定用于初始化和训练的算法。
使用Nguyen-Widrow层初始化方法初始化每个层的权重和偏差(initnw
).使用Levenberg-Marquardt反向传播(trainlm
),以便在给定示例输入向量的情况下,第三层的输出学会以最小的均方误差(均方误差
).
网络定义
第一步是创建一个新的网络。输入下面的代码来创建一个网络并查看它的许多属性:
网络
体系结构属性
显示的第一组属性被标记体系结构
属性。这些属性允许您选择输入和层及其连接的数量。
输入和层数。维度组中显示的前两个属性是numInputs
而且numLayers
.这些属性允许您选择希望网络具有多少输入和层。
net = dimensions: numInputs: 0 numLayers: 0…
请注意,此时网络没有输入或层。
通过将这些属性设置为自定义网络图中的输入数量和层数来改变这一点。
net.numInputs= 2; net.numLayers = 3;
net.numInputs
是输入源的数量,而不是输入向量中元素的数量(net.inputs{我}.size
).
偏见的连接。类型网
并按输入再次查看其属性。网络现在有两个输入和三层。
net =神经网络:维度:numinput: 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向量。的偏置连接我你可以设置图层net.biasConnect(我)
来1
.如图所示,指定第一层和第三层有偏置连接,输入以下代码:
net.biasConnect(1) = 1;net.biasConnect(3) = 1;
您还可以用一行代码定义这些连接。
net.biasConnect= [1; 0; 1];
输入和层权重连接。输入连接矩阵是3乘2的,表示存在从两个源(两个输入)到三个目的地(三个层)的连接。因此,net.inputConnect (i, j)
控件的输入权重连接的存在我第Th层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(林英俊)
控件的层权重连接的存在我第Th层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];
输出数
类型网
并按输入命令,查看已更新的属性。最后三个体系结构属性是只读值,这意味着它们的值由为其他属性所做的选择决定。维度组中的第一个只读属性是输出的数量:
numOutputs: 2
通过定义来自第2层和第3层的输出连接,您指定了网络有两个输出。
子对象属性
输出显示中的下一组属性是子对象:
subobjects: input: {2x1单元格数组2个输入}layers: {3x1单元格数组3个图层}outputs: {1x3单元格数组2个输出}bias: {3x1单元格数组2个偏差}inputwights: {3x2单元格数组3个权重}layerWeights: {3x3单元格数组3个权重}
输入
当您设置输入数量时(net.numInputs
)到2,the输入
属性变成了两个输入结构的单元格数组。每一个我Th输入结构(net.inputs{我}
属性关联的附加属性我输入。
要查看输入结构的排列方式,请键入
网我nputs 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} procesdrange: [] processedSize: 0 range: [] size: 0 userdata:(您的自定义信息)
如果你设置exampleInput
财产,范围
,大小
,processedSize
,processedRange
属性将自动更新,以匹配属性的值exampleInput
.
设置exampleInput
属性如下:
net.inputs{1}。exampleInput= [0 10 5; 0 3 10];
如果您再次检查第一个输入的结构,您会看到它现在有了新的值。
房地产processFcns
可以设置为一个或多个处理函数。类型帮助nnprocess
查看这些函数的列表。
对5个元素设置第二个输入向量的范围为−2到2,如下所示:
net.inputs{1}。processFcns= {'removeconstantrows','mapminmax'};
查看新的输入属性。你会看到的processParams
,processSettings
,processedRange
而且processedSize
是否已全部更新以反映输入将使用removeconstantrows
而且mapminmax
在被给予网络之前,对网络进行模拟或训练。房地产processParams
包含每个处理函数的默认参数。如果愿意,您可以更改这些值。请参阅每个处理函数的参考页,以了解有关它们的参数的更多信息。
当不使用任何处理函数时,可以直接设置输入的大小:
net.inputs{2}。Size = 5;
层。当你设置层数(net.numLayers
)到3,即层
属性变成了单元阵列三层结构。键入下面的代码行,查看与第一层相关的属性。
网layers{1} ans =神经网络层名称:'层'维度:0 distanceFcn:(无)distanceParam:(无)距离:[]initFcn: 'initwb' netInputFcn: 'netsum' netInputParam:(无)位置:[]范围:[]size: 0 topologyFcn:(无)transferFcn: 'purelin' transferParam:(无)userdata:(您的自定义信息)
输入以下三行代码,将第一层的大小更改为4个神经元,其传递函数为tansig
,并将其初始化函数转换为Nguyen-Widrow函数,以满足自定义网络图的需要。
net.layers{1}。Size = 4;net.layers{1}。transferFcn = 'tansig';net.layers{1}。初始化Fcn = 'initnw';
第二层有三个神经元logsig
传递函数,并被初始化initnw
.将第二层的属性设置为所需值,如下所示:
net.layers {2} .size= 3; net.layers{2}.transferFcn = 'logsig'; net.layers{2}.initFcn = 'initnw';
第三层的大小和传递函数属性不需要改变,因为默认值与网络图中显示的匹配。只需要设置其初始化函数,如下所示:
net.layers{3}。初始化Fcn = 'initnw';
输出。使用这行代码可以看到输出
财产安排:
网输出ans = [] [1x1 nnetOutput] [1x1 nnetOutput]
请注意,输出
包含两个输出结构,一个用于第2层,一个用于第3层。这种安排自动发生时net.outputConnect
设置为[0 1 1]
.
用下面的表达式查看第二层的输出结构:
网outputs{2} ans =神经网络输出名称:'Output' feedbackInput: [] feedbackDelay: 0 feedbackMode: 'none' processFcns: {} processParams: {1x0 cell array of 0 params} processSettings: {0x0 cell array of 0 settings} procesdrange: [3x2 double] processedSize: 3 range: [3x2 double] size: 3 userdata:(您的自定义信息)
的大小
自动设置为3时,第二层的大小(net.layers {2} .size
)设置为该值。如果想验证第三层的输出结构是否正确,请查看第三层的输出结构大小
.
输出具有处理属性,这些属性在网络在训练期间使用之前自动应用于目标值。在网络模拟或训练期间,在层输出值作为网络输出值返回之前,将相同的处理设置反向应用于层输出值。
与输入处理属性类似,设置exampleOutput
属性自动导致大小
,范围
,processedSize
,processedRange
待更新。设置processFcns
到处理函数名原因的单元格数组列表processParams
,processSettings
,processedRange
待更新。然后您可以更改processParam
价值观,如果你愿意的话。
偏差,输入权重和层权重。输入以下命令查看偏压和权重结构的排列方式:
net.biasesnet.inputWeightsnet.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:(您的自定义信息)
通过设置各权重,根据组网图指定各权重的抽动延迟线延迟
属性:
net. inputwights {2,1}.delay = [0 1];net. inputwights {2,2}. delayed = 1;net.layerWeights{3,3}.delay = 1;
网络功能
类型网
并按返回再次查看下一组属性。
函数:adaptFcn:(none) adaptParam: (none)衍生fcn: '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初始化函数。
网初始化Fcn = 'initlay';
满足网络初始化需求。
设置性能为均方误差
(均方误差)和训练函数trainlm
(Levenberg-Marquardt反向传播),以满足自定义网络的最终要求。
网performFcn = 'mse';net.trainFcn= 'trainlm';
设置除法函数为dividerand
(随机划分训练数据)。
网divideFcn = ' diverand ';
在监督训练中,输入和目标数据随机分为训练、测试和验证数据集。网络在训练数据上进行训练,直到其性能在验证数据上开始下降,这表明泛化已经达到峰值。测试数据提供了一个完全独立的网络泛化测试。
将绘图函数设置为plotperform
(绘图训练,验证和测试性能)和plottrainstate
(绘制训练算法相对于epoch的状态)。
网plotFcns = {'plotperform','plottrainstate'};
权重和偏置值
在初始化和训练网络之前,键入网
并按返回,然后看权重和偏向组的网络属性。
权重和偏差值:IW: {3x2 cell}包含3个输入权重矩阵LW: {3x3 cell}包含3层权重矩阵b: {3x1 cell}包含2个偏差向量
这些单元格数组包含权重矩阵和与连接属性(net.inputConnect
,net.layerConnect
,net.biasConnect
)包含1和子对象属性(net.inputWeights
,net.layerWeights
,net.biases
)包含结构。
计算下面的每一行代码,可以发现所有的偏差向量和权重矩阵都被设置为0。
网IW{1},净。IW{2 1},净。IW{2,}。LW{3 1},净。LW{3 2},净。LW{3 3}。net.b b {1}, {3}
每个输入权重网IW {i, j}
,层权重网LW {i, j}
,偏差向量net.b{我}
的大小有多少行我第Th层(net.layers{我}.size
).
每个输入权重网IW {i, j}
的大小有相同多的列jTh输入(net.inputs {j} .size
)乘以其延迟值的数目(长度(net.inputWeights {i, j} .delays)
).
类的大小与每层权重的列数相同j第Th层(net.layers {j} .size
)乘以其延迟值的数目(长度(net.layerWeights {i, j} .delays)
).
网络行为
初始化
用下面这行代码初始化你的网络:
Net = init(Net);
再次检查网络的偏差和权重,看看它们是如何变化的:
网IW{1},净。IW{2 1},净。IW{2,}。LW{3 1},净。LW{3 2},净。LW{3 3}。net.b b {1}, {3}
例如,
网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 CommandLine Feedback showCommandLine: false CommandLine Frequency Show: 25 Maximum Epochs epoch: 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 decline 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
.