2010-03-10 60 views
6

Tôi đã huấn luyện mạng nơron xor trong Matlab và có những trọng lượng:mạng Neural trong MATLAB

iw: [-2.162 2.1706; 2.1565 -2.1688] 

lw: [-3.9174 -3.9183] 

b{1} [2.001; 2.0033] 

b{2} [3.8093] 

Chỉ cần từ sự tò mò tôi đã cố gắng để viết mã MATLAB mà tính đầu ra của mạng này (2 tế bào thần kinh trong lớp ẩn và 1 ở đầu ra, chức năng kích hoạt TANSIG).

Mã mà tôi nhận:

l1w = [-2.162 2.1706; 2.1565 -2.1688]; 
l2w = [-3.9174 -3.9183]; 
b1w = [2.001 2.0033]; 
b2w = [3.8093]; 

input = [1, 0]; 

out1 = tansig (input(1)*l1w(1,1) + input(2)*l1w(1,2) + b1w(1)); 
out2 = tansig (input(1)*l1w(2,1) + input(2)*l1w(2,2) + b1w(2)); 
out3 = tansig (out1*l2w(1) + out2*l2w(2) + b2w(1)) 

Vấn đề là khi đầu vào được cho phép nói [1,1], nó ra -0,9989, khi [0,1] 0,4902. Trong khi mô phỏng mạng được tạo với kết quả MATLAB đầy đủ là 0.000558750.99943.

Tôi đang làm gì sai?

+2

tại sao bạn không đăng mã thực tế bạn đã sử dụng để xây dựng và đào tạo mạng? – Amro

Trả lời

10

Tôi đã viết một ví dụ đơn giản về mạng XOR. Tôi đã sử dụng newpr, mặc định là tansig chức năng truyền cho cả lớp ẩn và đầu ra.

input = [0 0 1 1; 0 1 0 1];    %# each column is an input vector 
ouputActual = [0 1 1 0]; 

net = newpr(input, ouputActual, 2);  %# 1 hidden layer with 2 neurons 
net.divideFcn = '';      %# use the entire input for training 

net = init(net);       %# initialize net 
net = train(net, input, ouputActual);  %# train 
outputPredicted = sim(net, input);  %# predict 

thì chúng tôi kiểm tra kết quả bằng cách tính toán đầu ra. Điều quan trọng cần nhớ là theo mặc định, đầu vào/đầu ra là quy mô đến [-1,1] khoảng:

scaledIn = (2*input - 1);   %# from [0,1] to [-1,1] 
for i=1:size(input,2) 
    in = scaledIn(:,i);    %# i-th input vector 
    hidden(1) = tansig(net.IW{1}(1,1)*in(1) + net.IW{1}(1,2)*in(2) + net.b{1}(1)); 
    hidden(2) = tansig(net.IW{1}(2,1)*in(1) + net.IW{1}(2,2)*in(2) + net.b{1}(2)); 
    out(i) = tansig(hidden(1)*net.LW{2,1}(1) + hidden(2)*net.LW{2,1}(2) + net.b{2}); 
end 
scaledOut = (out+1)/2;    %# from [-1,1] to [0,1] 

hoặc hiệu quả hơn thể hiện dưới dạng ma trận trong một dòng:

scaledIn = (2*input - 1);   %# from [0,1] to [-1,1] 
out = tansig(net.LW{2,1} * tansig(net.IW{1}*scaledIn + repmat(net.b{1},1,size(input,2))) + repmat(net.b{2},1,size(input,2))); 
scaledOut = (1 + out)/2;   %# from [-1,1] to [0,1] 
+2

Điều này thực sự là câu trả lời sâu sắc, cảm ơn người đàn ông! – spacemonkey

-1

Bạn thường không sử dụng hình sigmoid trên lớp đầu ra - bạn có chắc chắn bạn nên có tansig trên out3 không? Và bạn có chắc là bạn đang nhìn vào trọng lượng của mạng được đào tạo thích hợp không? Có vẻ như bạn đã có một mạng được đào tạo để thực hiện XOR trên [1,1] [1, -1] [-1,1] và [-1, -1], với +1 có nghĩa là "xor" và -1 có nghĩa là "giống nhau".

+0

Sau đó, làm thế nào để bạn bình thường hóa đầu ra của bạn nếu bạn không sử dụng Sigmoid trong lớp đầu ra? Hơn nữa làm thế nào để bạn đo lỗi nếu đầu ra của bạn không được chuẩn hóa? – Kiril

+0

Đối với một trình phân loại, bạn chọn đầu ra có giá trị cao nhất (hoặc chuyển đổi ở điểm 50%) để đưa ra quyết định của mình. Bạn không cần phi tuyến. Trong trường hợp này nó là _okay_ để làm điều đó, nhưng nó không thực sự thêm nhiều. –

+1

vấn đề sử dụng hàm tuyến tính trong lớp đầu ra trở nên rõ ràng khi bạn muốn nhận được xác suất sau của mỗi lớp ngoài các phân loại .. – Amro