簡體   English   中英

Matlab神經網絡手寫數字識別,輸出無差異

[英]Matlab neural network handwritten digit recognition, output going to indifference

我正在嘗試使用Matlab構建一個神經網絡,該網絡可以對30x30像素的手寫數字進行分類。 我使用反向傳播來找到正確的權重和偏差。 網絡以900個輸入開始,然后有2個包含16個神經元的隱藏層,最后以10個輸出結束。 每個輸出神經元的值都在0到1之間,表示認為應該將輸入分類為某個數字。 問題在於,經過訓練后,輸出對輸入幾乎變得無動於衷,並且每個輸出的統一置信度為0.1。

我的方法是拍攝30x30像素的每幅圖像,並將其整形為900x1的矢量(請注意,“ Images_vector”在加載時已處於矢量格式)。 權重和偏差是從0到1之間的隨機值開始的。我正在使用隨機梯度下降來更新權重和偏差,每批10個隨機選擇的樣本。 這些方程式如Nielsen所述

腳本如下。

%% Inputs
numberofbatches = 1000;
batchsize = 10;
alpha = 1;
cutoff = 8000;
layers = [900 16 16 10];

%% Initialization
rng(0);

load('Images_vector')
Images_vector = reshape(Images_vector', 1, 10000);
labels = [ones(1,1000) 2*ones(1,1000) 3*ones(1,1000) 4*ones(1,1000) 5*ones(1,1000) 6*ones(1,1000) 7*ones(1,1000) 8*ones(1,1000) 9*ones(1,1000) 10*ones(1,1000)];
newOrder = randperm(10000);
Images_vector = Images_vector(newOrder);
labels = labels(newOrder);
images_training = Images_vector(1:cutoff);
images_testing = Images_vector(cutoff + 1:10000);

w = cell(1,length(layers) - 1);
b = cell(1,length(layers));
dCdw = cell(1,length(layers) - 1);
dCdb = cell(1,length(layers));
for i = 1:length(layers) - 1
    w{i} = rand(layers(i+1),layers(i));
    b{i+1} = rand(layers(i+1),1);
end

%% Learning process
batches = randi([1 cutoff - batchsize],1,numberofbatches);

cost = zeros(numberofbatches,1);
c = 1;
for batch = batches
    for i = 1:length(layers) - 1
        dCdw{i} = zeros(layers(i+1),layers(i));
        dCdb{i+1} = zeros(layers(i+1),1);
    end

    for n = batch:batch+batchsize
        y = zeros(10,1);
        disp(labels(n))
        y(labels(n)) = 1;

        % Network
        a{1} = images_training{n};
        z{2} = w{1} * a{1} + b{2};
        a{2} = sigmoid(0, z{2});
        z{3} = w{2} * a{2} + b{3};
        a{3} = sigmoid(0, z{3});
        z{4} = w{3} * a{3} + b{4};
        a{4} = sigmoid(0, z{4});

        % Cost
        cost(c) = sum((a{4} - y).^2) / 2;

        % Gradient
        d{4} = (a{4} - y) .* sigmoid(1, z{4});
        d{3} = (w{3}' * d{4}) .* sigmoid(1, z{3});
        d{2} = (w{2}' * d{3}) .* sigmoid(1, z{2});

        dCdb{4} = dCdb{4} + d{4} / 10;
        dCdb{3} = dCdb{3} + d{3} / 10;
        dCdb{2} = dCdb{2} + d{2} / 10;

        dCdw{3} = dCdw{3} + (a{3} * d{4}')' / 10;
        dCdw{2} = dCdw{2} + (a{2} * d{3}')' / 10;
        dCdw{1} = dCdw{1} + (a{1} * d{2}')' / 10;

        c = c + 1;
    end

    % Adjustment
    b{4} = b{4} - dCdb{4} * alpha;
    b{3} = b{3} - dCdb{3} * alpha;
    b{2} = b{2} - dCdb{2} * alpha;
    w{3} = w{3} - dCdw{3} * alpha;
    w{2} = w{2} - dCdw{2} * alpha;
    w{1} = w{1} - dCdw{1} * alpha;
end

figure
plot(cost)
ylabel 'Cost'
xlabel 'Batches trained on'

S形函數如下。

function y = sigmoid(derivative, x)

if derivative == 0
    y = 1 ./ (1 + exp(-x));
else
    y = sigmoid(0, x) .* (1 - sigmoid(0, x));
end

end

除此之外,我還嘗試在每個批次中使每個數字中有1個,但這給出了相同的結果。 我也嘗試過更改批次大小,批次數和alpha,但是沒有成功。

有人知道我在做什么錯嗎?

如果我錯了,請糾正我:您的數據中有10000個樣本,您將其分為1000個批次(共10個樣本)。 您的訓練過程包括對這10000個樣本運行一次。

這可能太少了,通常您的訓練過程包括幾個時期(一個時期=每個樣本重復一次)。 您可以嘗試多次處理批次。

同樣對於900個輸入,您的網絡似乎很小。 嘗試在第二層中使用更多的神經元。 希望能幫助到你!

暫無
暫無

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

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