我不是深度学习的新手,所以我从最简单的测试用例开始:异或学习。
在G&W发行的新版《数字图像处理》中,作者举了一个通过3个层的深层网络进行XOR学习的示例:输入,隐藏和输出(每个层有2个神经元。),以及一个S形。网络激活功能。
对于网络的信息化,他们说:“我们使用alpha = 1.0,这是初始的高斯随机权重集,均值为零,标准偏差为0.02 ”(alpha是梯度下降学习率)。 培训有4个带有标签的示例:
X = [1 -1 -1 1;1 -1 1 -1];%MATLAB syntax
R = [1 1 0 0;0 0 1 1];%Labels
我编写了以下MATLAB代码来实现网络学习过程:
function output = neuralNet4e(input,specs)
NumPat = size(input.X,2);%Number of patterns
NumLayers = length(specs.W);
for kEpoch = 1:specs.NumEpochs
% forward pass
A = cell(NumLayers,1);%Output of each neuron in each layer
derZ = cell(NumLayers,1);%Activation function derivative on each neuron dot product
A{1} = input.X;
for kLayer = 2:NumLayers
B = repmat(specs.b{kLayer},1,NumPat);
Z = specs.W{kLayer} * A{kLayer - 1} + B;
derZ{kLayer} = specs.activationFuncDerive(Z);
A{kLayer} = specs.activationFunc(Z);
end
% backprop
D = cell(NumLayers,1);
D{NumLayers} = (A{NumLayers} - input.R).* derZ{NumLayers};
for kLayer = (NumLayers-1):-1:2
D{kLayer} = (specs.W{kLayer + 1}' * D{kLayer + 1}).*derZ{kLayer};
end
%Update weights and biases
for kLayer = 2:NumLayers
specs.W{kLayer} = specs.W{kLayer} - specs.alpha * D{kLayer} * A{kLayer - 1}' ;
specs.b{kLayer} = specs.b{kLayer} - specs.alpha * sum(D{kLayer},2);
end
end
output.A = A;
end
现在,当我使用它们的设置时(即,标准设置为0.02的权重初始化)
clearvars
s = 0.02;
input.X = [1 -1 -1 1;1 -1 1 -1];
input.R = [1 1 0 0;0 0 1 1];
specs.W = {[];s * randn(2,2);s * randn(2,2)};
specs.b = {[];s * randn(2,1);s * randn(2,1)};
specs.activationFunc = @(x) 1./(1 + exp(-x));
specs.activationFuncDerive = @(x) exp(-x)./(1 + exp(-x)).^2;
specs.NumEpochs = 1e4;
specs.alpha = 1;
output = neuralNet4e(input,specs);
我(在10000次练习之后)得到了网络的最终输出是
output.A{3} = [0.5 0.5 0.5 0.5;0.5 0.5 0.5 0.5]
但是当我将s = 0.02;
更改为s = 1;
时,我得到了output.A{3} = [0.989 0.987 0.010 0.010;0.010 0.012 0.0.98 0.98]
。
是否可能以s = 0.02;得到这些结果?我在代码中做错了什么?还是标准偏差0.02只是一个错字?
答案 0 :(得分:1)
根据您的代码,我看不到任何错误。据我所知,您得到的结果,
class Solution(object):
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if not root or not root.left and not root.right:
return 0
a = self.isBalanced(root.left)
b = self.isBalanced(root.right)
if abs(a-b)<=1:
return 1 + max(a,b)
else:
return False
return True
这是过度拟合的典型结果。发生这种情况的原因很多,例如时期太多,学习率太大,样本数据太小等等。
在您的示例中,s = 0.02限制了随机权重和偏差的值。将其更改为s = 1会使随机值保持不变/不按比例缩放。
要使s = 0.02有效,您可以尝试减少时期数或降低alpha。
希望这会有所帮助。