一個簡單的matlab專案實現三層神經網路的簡單應用
阿新 • • 發佈:2019-02-16
一、設計目的:進行1-100以內的質數分類
二、設計思路:
1、生成1-100以內的數和對應二進位制
2、對質數部分進行label為1,其餘為0
3、選擇前60組作為training資料,後40組testing
4、選擇三層神經網路,其中hidden和output部分使用sigmoid函式
三、程式碼實現:
1、測試資料生成函式
2、最優學習速率選擇函式,當hidden neurons 的數量分別選擇8和15時獲得alpha 最優為1和0.1,ask why?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;
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);
四、結果分析與後續工作:和之前簡單的奇偶數判別結果不同,誤差率非常大,是否因為素數的非線性特性決定?神經網路的結果怎麼與數學建立聯絡?