2011-10-17 66 views
5

Tôi đã tạo mạng nơron trong MATLAB với newff (...). Khi bạn đào tạo nó với cùng một đầu vào và đầu ra, kết quả đào tạo khác nhau về các lần chạy khác nhau. Tôi hiểu rằng nó đang xảy ra bởi vì trọng lượng khác nhau cho mỗi lần tôi chạy nó. Câu hỏi của tôi là làm thế nào để làm cho trọng lượng ban đầu là như nhau mỗi khi tôi đào tạo NN của tôi để tôi có thể nhận được kết quả tương tự? Ngoài ra, có thể tiết kiệm một số trọng lượng từ đào tạo No1 và sau đó sử dụng nó cho đào tạo No2, và làm thế nào?Mạng nơron trong MATLAB, trọng số ban đầu

Tnx

+1

Bạn có muốn thực sự đào tạo mạng lưới thần kinh? Nếu bạn sử dụng cùng trọng số trên mỗi chu kỳ đào tạo (nghĩa là trọng lượng không thay đổi), thì không có cách nào để bạn đào tạo mạng thần kinh ... vì vậy mục tiêu của bạn là gì? – Kiril

+0

Có, tôi muốn đào tạo NN. Trong tập tin .m tôi tạo, đào tạo và mô phỏng NN. Nhưng hiệu suất tốt nhất của việc đào tạo mạng tôi nhận được khi tôi chạy nó lần thứ ba.Vì vậy, ý tưởng của tôi là để tiết kiệm trọng lượng từ lần chạy thứ hai và sử dụng chúng như trọng số ban đầu vào lần sau (vì vậy tôi không cần phải chạy nó 3 lần liên tiếp). – user999507

Trả lời

6

Để generate reproducible results, bạn cần phải tự thiết lập các bộ tạo số ngẫu nhiên để hạt giống/tiểu bang vào đầu của mã này. Điều này có thể được thực hiện trong một number of ways (tùy thuộc vào những gì phiên bản của MATLAB bạn có):

Các phong cách cũ:

rand('twister',1234) 

Các phong cách Cập nhật:

RandStream.setGlobalStream(RandStream('mt19937ar','Seed',1234)); 

Một new function được giới thiệu vào R2011a đơn giản hóa cuộc gọi cuối cùng:

rng(1234,'twister') 

L Cú pháp atter là phương pháp được khuyến nghị.

2

Là một lưu ý phụ và không phải là câu trả lời trực tiếp, có điều gì đó có tên là Nguyen Widrow initialization and it's already implemented in Matlab's Neural Net toolbox.

Theo kinh nghiệm của tôi, nó hoạt động khá tốt và giúp mạng neural hội tụ nhanh hơn. Tôi đã thấy rằng nó cũng làm cho kết quả phù hợp hơn nữa. Tôi khuyên bạn nên sử dụng nó cũng như hạt giống ngẫu nhiên cố định theo Amro's post.

+0

Chris đúng, kiểm tra cẩn thận loại khởi tạo nào được sử dụng như mặc định, vì trong các phiên bản cuối của MATLAB, mặc định KHÔNG phải là khởi tạo ngẫu nhiên mà là thuật toán init của Nguyễn Widrow. –

-1
If you really want to have the weights before and after the training of NN you can use these codes : 

for n1=4:8 
    wb1=rand(n1,n_input); 
    wb2=rand(n_output,n1); 
    bb1=rand(n1,1); 
    bb2=rand(n_output,1); 

    wb=[wb1(:);wb2(:);bb1;bb2]'; 

    xlswrite(['weight' num2str(n1) '.xlsx'],wb,'Sheet1',num2str(n1)); 

end 


if n1==4 
     wb = xlsread(['weight' num2str(n1) '.xlsx']); 
     i1 = n1*n_input; 
     i2 = n_output*n1; 
     i3 = n1; 
     i4 = n_output; 

     f1=wb(1:i1); 
     f2=wb(i1+1:i1+i2); 
     f3=wb(i1+i2+1:i1+i2+i3); 
     f4=wb(i1+i2+i3+1:i1+i2+i3+i4); 

     wb1=reshape(f1,n1,n_input); 
     wb2=reshape(f2,n_output,n1); 
     bb1=reshape(f3,n1,1); 
     bb2=reshape(f4,n_output,1); 

    elseif n1==5 
     wb=xlsread(['weight' num2str(n1) '.xlsx']); 
     i1=n1*n_input; 
     i2=n_output*n1; 
     i3=n1; 
     i4=n_output; 

     f1=wb(1:i1); 
     f2=wb(i1+1:i1+i2); 
     f3=wb(i1+i2+1:i1+i2+i3); 
     f4=wb(i1+i2+i3+1:i1+i2+i3+i4); 

     wb1=reshape(f1,n1,n_input); 
     wb2=reshape(f2,n_output,n1); 
     bb1=reshape(f3,n1,1); 
     bb2=reshape(f4,n_output,1); 

    elseif n1==6 
     wb=xlsread(['weight' num2str(n1) '.xlsx']); 
     i1=n1*n_input; 
     i2=n_output*n1; 
     i3=n1; 
     i4=n_output; 

     f1=wb(1:i1); 
     f2=wb(i1+1:i1+i2); 
     f3=wb(i1+i2+1:i1+i2+i3); 
     f4=wb(i1+i2+i3+1:i1+i2+i3+i4); 

     wb1=reshape(f1,n1,n_input); 
     wb2=reshape(f2,n_output,n1); 
     bb1=reshape(f3,n1,1); 
     bb2=reshape(f4,n_output,1); 

    elseif n1==7 
     wb=xlsread(['weight' num2str(n1) '.xlsx']); 
     i1=n1*n_input; 
     i2=n_output*n1; 
     i3=n1; 
     i4=n_output; 

     f1=wb(1:i1); 
     f2=wb(i1+1:i1+i2); 
     f3=wb(i1+i2+1:i1+i2+i3); 
     f4=wb(i1+i2+i3+1:i1+i2+i3+i4); 

     wb1=reshape(f1,n1,n_input); 
     wb2=reshape(f2,n_output,n1); 
     bb1=reshape(f3,n1,1); 
     bb2=reshape(f4,n_output,1); 

    elseif n1==8 
     wb=xlsread(['weight' num2str(n1) '.xlsx']); 
     i1=n1*n_input; 
     i2=n_output*n1; 
     i3=n1; 
     i4=n_output; 

     f1=wb(1:i1); 
     f2=wb(i1+1:i1+i2); 
     f3=wb(i1+i2+1:i1+i2+i3); 
     f4=wb(i1+i2+i3+1:i1+i2+i3+i4); 

     wb1=reshape(f1,n1,n_input); 
     wb2=reshape(f2,n_output,n1); 
     bb1=reshape(f3,n1,1); 
     bb2=reshape(f4,n_output,1); 
    end 

    net = newff(inputs,targets,4,{'tansig','purelin'},'trainlm'); 
    n.IW{1,1}=wb1; 
    n.LW{2,1}=wb2; 
    n.b{1}=bb1; 
    n.b{2}=bb2; 


And after training for saving the network you want : 

[net tr] = train(net,inputs,targets); 

wb11=n.IW{1,1}; 
    wb22=n.LW{2,1}; 
    bb11=n.b{1}; 
    bb22=n.b{2}; 

    wbzz=[wb11(:);wb22(:);bb11;bb22]'; 

    xlswrite('weight.xlsx',wbzz,'Sheet1'); 
2

Matlab thần kinh kết quả mạng lưới hộp công cụ khác nhau là vì hai lý do: 1-ngẫu nhiên phân chia dữ liệu 2-ngẫu nhiên trọng lượng khởi

Đối với bộ phận dữ liệu chức năng vấn đề sử dụng khác nhau "divideblock" hoặc "divideint" thay vì " dividerand" như thế này:

net.dividefcn='divideblock; net.divideparam.trainratio=.7; net.divideparam.valratio=.15; net.divideparam.testratio=.15;

Đối với vấn đề khởi tạo trọng lượng ngẫu nhiên, Có vẻ như (tôi không chắc) tất cả các hàm khởi tạo Matlab ("initzero", "initlay", "initwb", "initnw") gần như là ngẫu nhiên. Vì vậy, bạn nên buộc các chức năng này tạo ra kết quả tương tự cho mỗi cuộc gọi.

RandStream.setGlobalStream (RandStream ('mrg32k3a','Seed', 1234));

Và sau đó sử dụng một trong số họ:

net.initFcn='initlay'; net.layers{i}.initFcn='initnw';

+0

bắt đầu định dạng mã của bạn, mất kiên nhẫn ;-) Vui lòng chỉnh sửa và xóa bản thân phần còn lại – kleopatra

+0

Backticks là gì? –

Các vấn đề liên quan