1. 程式人生 > >一個簡單的matlab專案實現三層神經網路的簡單應用

一個簡單的matlab專案實現三層神經網路的簡單應用

一、設計目的:進行1-100以內的質數分類

二、設計思路:

1、生成1-100以內的數和對應二進位制

2、對質數部分進行label為1,其餘為0

3、選擇前60組作為training資料,後40組testing

4、選擇三層神經網路,其中hidden和output部分使用sigmoid函式

三、程式碼實現:

1、測試資料生成函式

function f = dataset_generator

bits_num = 7;
prime_table = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97];
prime_numble = 25;
prime_dataset = zeros(100,8);

%Generate prime number dataset 1-100
for count = 1:100
    bin_str = dec2bin(count,bits_num);
    for i = 1:bits_num
        prime_dataset(count,i) = str2num(bin_str(i));
    end
    for i = 1:prime_numble
        if(count == prime_table(i))
            prime_dataset(count,bits_num+1) = 1;
        end
    end
    if(prime_dataset(count,bits_num+1)~=1)
        prime_dataset(count,bits_num+1) = 0;
    end
end

f = prime_dataset;
        
2、最優學習速率選擇函式,當hidden neurons 的數量分別選擇8和15時獲得alpha 最優為1和0.1,ask why?
function test_script1


%Training Set
data = dataset_generator;
x_train = data(1:60,1:7);
y_train = data(1:60,8);
x_test  = data(61:100,1:7);
y_test = data(61:100,8);

for pow_num = 1:5
    
    %Learning Rate
    alpha = 10^(-3+pow_num);
    
    %Initialize the network
    syn0 = 2*rand(7,15)-1;
    syn1 = 2*rand(15,1)-1;
    
    %Training the network
    for i = 1:60000
        l0 = x_train;
        l1 = sigmoid(l0*syn0);
        l2 = sigmoid(l1*syn1);
        l2_error = l2 - y_train;
        if(i==1)
            overallerror(i) = mean(abs(l2_error));
        end
        if(mod(i,10000)==0)
            overallerror(i/10000+1) = mean(abs(l2_error));
        end
        l2_delta = l2_error.*sigmoid_derivation(l2);
        l1_error = l2_delta*syn1';
        l1_delta = l1_error.*sigmoid_derivation(l1);
        syn1 = syn1 - alpha*(l1'*l2_delta);
        syn0 = syn0 - alpha*(l0'*l1_delta);
    end
    alpha
    overallerror
end



%Testing progress
%testing_output = sigmoid(sigmoid(x_test*syn0)*syn1)
%testing_error = sum(abs(y_test - testing_output))







function s = sigmoid (x)
[m,n] = size(x);
for i = 1:m
    for j = 1:n
        s(i,j) = 1/(1+exp(-x(i,j)));
    end
end

function s = sigmoid_derivation(x)
s = x.*(1-x);


3、主程式,包括資料生成、訓練測試資料選擇、網路訓練、網路測試、結果比較
function test_script

%Training Set
data = dataset_generator;
x_train = data(1:60,1:7);
y_train = data(1:60,8);
x_test  = data(61:100,1:7);
y_test = data(61:100,8);

%According to result of "test_script1.m" 
%Learning rate 
%"alpha = 1" --------- "number of hidden neurons = 8"
%"alpha = 0.1" --------- "number of hidden neurons = 15"
alpha = 0.1;

%Initialize the network
syn0 = 2*rand(7,15)-1;
syn1 = 2*rand(15,1)-1;

%Training the network
for i = 1:60000
    l0 = x_train;
    l1 = sigmoid(l0*syn0);
    l2 = sigmoid(l1*syn1);
    l2_error = l2 - y_train;
    if(i==1)
        overallerror(i) = mean(abs(l2_error));
    end
    if(mod(i,10000)==0)
        overallerror(i/10000+1) = mean(abs(l2_error));
    end
    l2_delta = l2_error.*sigmoid_derivation(l2);
    l1_error = l2_delta*syn1';
    l1_delta = l1_error.*sigmoid_derivation(l1);
    syn1 = syn1 - alpha*(l1'*l2_delta);
    syn0 = syn0 - alpha*(l0'*l1_delta);
end
overallerror



%Testing progress
testing_output = sigmoid(sigmoid(x_test*syn0)*syn1);
testing_output = round(testing_output);
testing_error = sum(abs(y_test - testing_output))
for cnt = 61:100
    testing_output(cnt-60,2) = cnt;
end
testing_output








function s = sigmoid (x)
[m,n] = size(x);
for i = 1:m
    for j = 1:n
        s(i,j) = 1/(1+exp(-x(i,j)));
    end
end

function s = sigmoid_derivation(x)
s = x.*(1-x);


四、結果分析與後續工作:和之前簡單的奇偶數判別結果不同,誤差率非常大,是否因為素數的非線性特性決定?神經網路的結果怎麼與數學建立聯絡?