深度学习

理解和使用深度学习网络

定义你自己的网络层(重看)

今天我想继续我之前的帖子,定义自己的网络层.有两个读者的评论引起了我的注意。

第一个评论,来自Eric Shields,指出了一个关键的结论Clevert, Unterthiner和Hichreiter纸被我忽略了。我最初只关注指数线性单位函数的定义,但Eric指出,作者得出的结论是,在使用ELU层时,可能不需要我在简单网络中使用的批处理归一化。

这里有一个关于ELU曲线的提醒(来自上一篇文章)。

这是上次用过的简单网络。

层= [...imageInputLayer([28 28 1]) convolution2dLayer(5,20) batchNormalizationLayer eluLayer(20) fullyConnectedLayer(10) softmaxLayer classificationLayer];

我使用了样本数字训练集。

[XTrain, YTrain] = digitTrain4DArrayData;imshow (XTrain (::,:, 1010),“InitialMagnification”“健康”) YTrain (1010)
Ans =绝对的

现在我将再次训练网络,使用与上次相同的选项。

选项= trainingOptions(“个”);net = trainNetwork(XTrain,YTrain,图层,选项);
单GPU训练。初始化图像归一化。|=========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习| | | | | | |精度损失速率(秒)  | |=========================================================================================| | 1 | 1 | 0.01 | 2.5899 | 10.16% | 0.0100 | | 2 | 50 | 0.61 | 0.4156 | 85.94% | 0.0100 | | 3 | 100 | 1.20 | 0.1340 | 96.88% | 0.0100 | | 150 | | 1.80 | 0.0847 | 98.44% | 0.0100 | | 6 | 200 |2.41 | 0.0454 | 100.00% | 0.0100 | | 250 | | 3.01 | 0.0253 | 100.00% | 0.0100 | | 300 | | 3.60 | 0.0219 | 100.00% | 0.0100 | | 350 | | 4.19 | 0.0141 | 100.00% | 0.0100 | | 400 | | 4.85 | 0.0128 | 100.00% | 0.0100 | | 450 | | 5.46 | 0.0126 | 100.00% | 0.0100 | | 500 | | 6.05 | 0.0099 | 100.00% | 0.0100 | | | 550 | | 0.0100 | 6.66 | 0.0079 | 100.00% | 16 | 600 | 7.27 | 0.0084 | 100.00% | 0.0100 | | 650 | | 7.86 | 0.0075 | 100.00% | 0.0100 | | 700 | | 8.45 | 0.0081 | 100.00%|0.0100 | | 20 | 750 | 9.05 | 0.0066 | 100.00% | 0.0100 | | 21 | 800 | 9.64 | 0.0057 | 100.00% | 0.0100 | | 22 | 850 | 10.24 | 0.0054 | 100.00% | 0.0100 | | 24 | 900 | 10.83 | 0.0049 | 100.00% | 0.0100 | | 25 | 950 | 11.44 | 0.0055 | 100.00% | 0.0100 | | 26 | 1000 | 12.04 | 0.0046 | 100.00% | 0.0100 | | 27 | 1050 | 12.66 | 0.0041 | 100.00% | 0.0100 | | 29 | 1100 | 13.25 | 0.0044 | 100.00% | 0.0100 | | 30 | 1150 | 13.84 | 0.0038 | 100.00% | 0.0100 | | 30 | 1170 | 14.08 | 0.0042 | 100.00% | 0.0100 | |=========================================================================================|

请注意,训练时间约为14.1秒。

检查训练网络的准确性。

[XTest, YTest] = digitTest4DArrayData;YPred = category (net, XTest);精度= sum(YTest==YPred)/numel(YTest)
准确度= 0.9878

现在让我们创建另一个没有批处理规范化层的网络。

Layers2 = [...imageInputLayer([28 28 1]) convolution2dLayer(5,20) eluLayer(20) fullyConnectedLayer(10) softmaxLayer classificationLayer];

再次训练它。

net2 = trainNetwork(XTrain,YTrain,layers2,options);
单GPU训练。初始化图像归一化。|=========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习| | | | | | |精度损失速率(秒)  | |=========================================================================================| | 1 | 1 | 0.01 | 2.3022 | 7.81% | 0.0100 | | 2 | 50 | 0.52 | 1.6631 | 51.56% | 0.0100 | | 3 | 100 | 1.04 | 1.4368 | 52.34% | 0.0100 | | 150 | | 1.58 | 1.0426 | 61.72% | 0.0100 | | 6 | 200 |2.12 | 0.8223 | 72.66% | 0.0100 | | 250 | | 2.67 | 0.6842 | 80.47% | 0.0100 | | 300 | | 3.21 | 0.6461 | 78.13% | 0.0100 | | 350 | | 3.79 | 0.4181 | 85.94% | 0.0100 | | 400 | | 4.33 | 0.4163 | 86.72% | 0.0100 | | 450 | | 4.88 | 0.2115 | 96.09% | 0.0100 | | 500 | | 5.42 | 0.1817 | 97.66% | 0.0100 | | | 550 | | 0.0100 | 5.96 | 0.1809 | 96.09% | 16 | 600 | 6.53 | 0.1001 | 100.00% | 0.0100 | | 650 | | 7.07 | 0.0899 | 100.00% | 0.0100 | | 700 | | 7.61 | 0.0934 | 0.0100 | 99.22%||20 | 750 | 8.14 | 0.0739 | 99.22% | 0.0100 | | 21 | 800 | 8.68 | 0.0617 | 100.00% | 0.0100 | | 22 | 850 | 9.22 | 0.0462 | 100.00% | 0.0100 | | 24 | 900 | 9.76 | 0.0641 | 100.00% | 0.0100 | | 25 | 950 | 10.29 | 0.0332 | 100.00% | 0.0100 | | 26 | 1000 | 10.86 | 0.0317 | 100.00% | 0.0100 | | 27 | 1050 | 11.41 | 0.0378 | 99.22% | 0.0100 | | 29 | 1100 | 11.96 | 0.0235 | 100.00% | 0.0100 | | 30 | 1150 | 12.51 | 0.0280 | 100.00% | 0.0100 | | 30 | 1170 | 12.73 | 0.0307 | 100.00% | 0.0100 | |=========================================================================================|

这只需要12.7秒的训练时间,大约减少了10%。检查准确性。

[XTest, YTest] = digitTest4DArrayData;YPred = category (net2, XTest);精度= sum(YTest==YPred)/numel(YTest)
准确度= 0.9808

埃里克说他得到了同样的准确率,而我看到的准确率略低。但我还没有进一步探讨这个问题,所以我不会得出任何结论。我只是想利用这个机会回顾一下上次我忽略了的论文中一个重要的观点。

另一位读者(另一位Eric)想知道alpha在运行时是否可以指定为可学习参数或不可学习参数。

答案:是的,但是必须定义第二个类。回顾模板中定义具有可学习属性的层的部分:

属性(可学的)%(可选)层可学习参数%层可学习参数在这里结束

可学的属性块的属性是类定义的固定部分。它不能动态更改。因此,您需要定义第二个类。我就叫我的eluLayerFixedAlpha.下面是属性块:

属性α结束

这是一个构造函数α作为输入参数。

方法函数层= eluLayerFixedAlpha(alpha,name)层。类型=“指数线性单位”;层。α= alpha;如果传入,则分配层名。如果Nargin > 1层。Name = Name;结束给图层一个有意义的描述。层。描述=带的指数线性单位:+...α;结束

我还修改了落后的方法删除与损失函数对alpha的导数相关的计算和输出参数。

函数dLdX =向后(层,X, Z, dLdZ, ~)将损失函数的导数反向传播%层%的输入:% layer -向后传播的层% X -输入数据% Z -层正向函数的输出% dLdZ -梯度从深层传播% memory -可用的内存值向后传播百分比[未使用]%输出:% dLdX -损失的导数%相对于输入数据dLdX = dLdZ .* ((X > 0) +...((层。α+Z) .* (X <= 0)));结束

我们试试吧。我要给它赋一个值α

Alpha = 1.0;Layers3 = [...imageInputLayer([28 28 1]) convolution2dLayer(5,20) eluLayerFixedAlpha(alpha) fullyConnectedLayer(10) softmaxLayer classificationLayer];net3 = trainNetwork(XTrain,YTrain,layers3,options);YPred = category (net3, XTest);精度= sum(YTest==YPred)/numel(YTest)
单GPU训练。初始化图像归一化。|=========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习| | | | | | |精度损失速率(秒)  | |=========================================================================================| | 1 | 1 | 0.01 | 2.3005 | 14.06% | 0.0100 | | 2 | 50 | 0.48 | 1.4979 | 53.13% | 0.0100 | | 3 | 100 | 0.97 | 1.2162 | 57.81% | 0.0100 | | 150 | | 1.48 | 1.1427 | 67.97% | 0.0100 | | 6 | 200 |1.99 | 0.9837 | 67.19% | 0.0100 | | 250 | | 2.50 | 0.8110 | 70.31% | 0.0100 | | 300 | | 3.04 | 0.7347 | 75.00% | 0.0100 | | 350 | | 3.55 | 0.5937 | 81.25% | 0.0100 | | 400 | | 4.05 | 0.5686 | 78.13% | 0.0100 | | 450 | | 4.56 | 0.4678 | 85.94% | 0.0100 | | 500 | | 5.06 | 0.3461 | 88.28% | 0.0100 | | | 550 | | 0.0100 | 5.57 | 0.3515 | 87.50% | 16 | 600 | 6.07 | 0.2582 | 92.97% | 0.0100 | | 650 | | 6.58 | 0.2216 | 92.97% | 0.0100 | | 700 | | 7.08 | 0.1705 | 0.0100 | | 96.09%|20 | 750 | 7.59 | 0.1212 | 98.44% | 0.0100 | | 21 | 800 | 8.09 | 0.0925 | 98.44% | 0.0100 | | 22 | 850 | 8.59 | 0.1045 | 97.66% | 0.0100 | | 24 | 900 | 9.10 | 0.1289 | 96.09% | 0.0100 | | 25 | 950 | 9.60 | 0.0710 | 99.22% | 0.0100 | | 26 | 1000 | 10.10 | 0.0722 | 99.22% | 0.0100 | | 27 | 1050 | 10.60 | 0.0600 | 99.22% | 0.0100 | | 29 | 1100 | 11.10 | 0.0688 | 99.22% | 0.0100 | | 30 | 1150 | 11.61 | 0.0519 | 100.00% | 0.0100 | | 30 | 1170 | 11.82 | 0.0649 | 99.22% | 0.0100 | |=========================================================================================| accuracy = 0.9702

谢谢你们的评论和问题,Eric和Eric。




发布与MATLAB®R2017b

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。