簡體   English   中英

用深度神經網絡學習XOR

[英]Learning XOR with deep neural network

我是深度學習的新手,所以我從最簡單的測試用例開始:XOR學習。

在G&W發行的新版《數字圖像處理》中,作者給出了一個通過三層深度網絡進行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

現在,當我使用其設置時(即,std = 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.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5]

這是過度擬合的典型結果。 發生這種情況的原因很多,例如時期太多,學習率太大,樣本數據太小等等。

在您的示例中,s = 0.02限制了隨機權重和偏差的值。 將其更改為s = 1將使隨機值保持不變/不按比例縮放。

為了使s = 0.02有效,您可以嘗試減少時期數或降低alpha。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM