deep learning 深度学习网络的微调

时间:2022-01-28 09:57:25

       在前三节中,讲述了如何训练一个网络,但是得到的识别率还不是很高。是通过两次自学习得到的参数。下面大致叙述粗调和微调。

    粗调

    第一次自学习:第一层网络为输入层,输入维数为784维,隐含层为300维,输出维数为784维,得到第一层的参数W(1)和b(1)。然后固定第一层的参数W(1)b(1),一共含有471484个参数。

    第二次自学习:输入层通过第一层的参数W(1)b(1)得到第一层隐含层的特征训练第二层隐含层,假定第二层隐含层神经元为150层,那么第二次自学习的输入层为300维(第二次自学习的输入层是整个网络的第二层),隐含层为150维,输出层与输入维数相等为300维,得到第二层的参数W(2)和b(2),一共含有90450个参数。

    softmax分类器学习:输入层为150维(一样,这儿的输入层为整个网络的第三层),没有隐含层,直接是10维的输入分类,训练第三层的参数W(3),一共含有1500个参数。

    这样做调节的好处是:如何采用损失函数的反馈调节,由于每次神经元太多,会导致一层每个神经元的损失贡献率本来就非常非常低,每一层这样反馈,假定从最后一层神经元到第二层神经元,这样层层反馈,第二层神经元的梯度变化很小,更不用说层数更多的深度网络。整个网络反馈会导致第二层参数调不动,所以就出现每层自学习。


    微调

   如果粗调已经得到了参数W(1)、W(2)、W(3)、b(1)、b(2),这样就已经形成了一个分类器了,效果如上节所示为95.28%,对于10分类,效果已经很不错了。如果还想提高分类器效果,对于上述粗调形成的分类器,第一次和第二次自学习都是无监督的学习,只有softmax分类器学习才是有监督,前两次学习只是为了提取有效特征。但是,问题来了,你如果想更好的提取特征,使分类效果达到更好,不妨在前面已建立的网络的基础上进行微调,也可以说是微学习。固定参数,使整个网络都进行有监督的学习,可以从生物学上说减少其盲目性的乱学习特征,这样从最后一层向前反馈就能使网络达到微调。会得到很好的效果,实验结果在后面给出。

     可以给大家打个比方,假如说,猫和人是我们事先不知道的,就是说我们不知道这个东西是猫还是人,像刚生下的婴儿一样,随着婴儿长大,天天看到猫和人,在家长或者其他人不说的情况,这个小孩子(婴儿长大了)不知道见到的东西有什么不一样,只知道这个两个事物是不同,一个有毛且小,一个无毛且大。当这个小孩知道这个特征后,大人说:有毛且小的是猫,无毛且大的是人,那么这个婴儿就能分开这个两个事物了,但是他通过已经提取的特征去认知,而不是事先给定标签去认知的,也就是说,现在小孩第一次就见到人或者猫了,大人说:这就是猫或者这就是人,那么这个小孩就从脑海里提取特征了,猫是什么特征,人又是什么特征,存储到自己的神经元中,下次看到进行搜索。这就是有监督和无监督的学习,不知道是否恰当。

实验结果:

deep learning 深度学习网络的微调

图1 第一层的参数视图

deep learning 深度学习网络的微调

图2 第二层的参数视图

deep learning 深度学习网络的微调    

图3 softmax分类器参数视图 


最终的到实验结果为微调前:95.28%。微调后为98.6%。这个告诉大家,微调是损失函数越低,识别就越高,我迭代400次的识别率仅仅为97.6%,迭代30次识别率就98.6%,过学习了。如果大家能实验尝试对图片加入噪声干扰。识别率会更高。学习到的特征会更鲁棒。

可以用上节学习到参数直接调节。

Multi.m

hiddenSize=200;
inputSize=28*28;
hiddenSize1=100;
lambda = 0.0001;
sparsityParam = 0.01;
lambda = 3e-3; % weight decay parameter
beta = 3;
numClasses=10;
images=loadMNISTImages('train-images.idx3-ubyte');
labels=loadMNISTLabels('train-labels.idx1-ubyte');
labels(labels==0) = 10;
stack = cell(2,1);
stack{1}.w = reshape(opttheta(1:hiddenSize * inputSize), hiddenSize, inputSize);
stack{1}.b =opttheta(2*hiddenSize*inputSize+1:2*hiddenSize*inputSize+hiddenSize);
stack{2}.w = reshape(opttheta1(1:hiddenSize1 * hiddenSize), hiddenSize1, hiddenSize);
stack{2}.b =opttheta1(2*hiddenSize1*hiddenSize+1:2*hiddenSize*hiddenSize1+hiddenSize1);
[stackparams, netconfig] = stack2params(stack);

stackedAETheta = [theta_new(:);stackparams];
addpath minFunc/;
options = struct;
options.Method = 'lbfgs';
options.maxIter = 30;
options.display = 'on';
[stackedAEOptTheta, cost] = minFunc(@(p)stackedAECost(p,inputSize,hiddenSize1,...
numClasses, netconfig,lambda, images, labels),...
stackedAETheta,options);%训练出第一层网络的参数


testData = loadMNISTImages('t10k-images.idx3-ubyte');
testLabels = loadMNISTLabels('t10k-labels.idx1-ubyte');
testLabels(testLabels == 0) = 10;
[pred] = stackedAEPredict(stackedAEOptTheta, inputSize, hiddenSize1, ...
numClasses, netconfig, testData);

acc = mean(testLabels(:) == pred(:));
fprintf('Before Finetuning Test Accuracy: %0.3f%%\n', acc * 100);


==============================================================================================================================

第五节: PCA、白化降维

================================================================================================

deep learning 深度学习网络的微调