2015-04-08 45 views
5

tôi có hiệu quả đào tạo rất khác với các mạng sauMô phỏng patternnet mặc định với feedforwardnet trong Matlab?

net = patternnet(hiddenLayerSize); 

và sau một

net = feedforwardnet(hiddenLayerSize, 'trainscg'); 
net.layers{1}.transferFcn = 'tansig'; 
net.layers{2}.transferFcn = 'softmax'; 
net.performFcn = 'crossentropy'; 

trên cùng một dữ liệu.

Tôi đã nghĩ mạng phải giống nhau.

Tôi quên gì?

CẬP NHẬT

Đoạn code dưới đây cho thấy, rằng hành vi của mạng duy nhất phụ thuộc vào chức năng tạo mạng.

Mỗi loại mạng được chạy hai lần. Điều này không bao gồm các vấn đề máy phát ngẫu nhiên hoặc một cái gì đó. Dữ liệu giống nhau.

hiddenLayerSize = 10; 

% pass 1, with patternnet 
net = patternnet(hiddenLayerSize); 

net.divideParam.trainRatio = 70/100; 
net.divideParam.valRatio = 15/100; 
net.divideParam.testRatio = 15/100; 

[net,tr] = train(net,x,t); 

y = net(x); 
performance = perform(net,t,y); 

fprintf('pass 1, patternnet, performance: %f\n', performance); 
fprintf('num_epochs: %d, stop: %s\n', tr.num_epochs, tr.stop); 

% pass 2, with feedforwardnet 
net = feedforwardnet(hiddenLayerSize, 'trainscg'); 
net.layers{1}.transferFcn = 'tansig'; 
net.layers{2}.transferFcn = 'softmax'; 
net.performFcn = 'crossentropy'; 

net.divideParam.trainRatio = 70/100; 
net.divideParam.valRatio = 15/100; 
net.divideParam.testRatio = 15/100; 

[net,tr] = train(net,x,t); 

y = net(x); 
performance = perform(net,t,y); 

fprintf('pass 2, feedforwardnet, performance: %f\n', performance); 
fprintf('num_epochs: %d, stop: %s\n', tr.num_epochs, tr.stop); 

% pass 1, with patternnet 
net = patternnet(hiddenLayerSize); 

net.divideParam.trainRatio = 70/100; 
net.divideParam.valRatio = 15/100; 
net.divideParam.testRatio = 15/100; 

[net,tr] = train(net,x,t); 

y = net(x); 
performance = perform(net,t,y); 

fprintf('pass 3, patternnet, performance: %f\n', performance); 
fprintf('num_epochs: %d, stop: %s\n', tr.num_epochs, tr.stop); 

% pass 2, with feedforwardnet 
net = feedforwardnet(hiddenLayerSize, 'trainscg'); 
net.layers{1}.transferFcn = 'tansig'; 
net.layers{2}.transferFcn = 'softmax'; 
net.performFcn = 'crossentropy'; 

net.divideParam.trainRatio = 70/100; 
net.divideParam.valRatio = 15/100; 
net.divideParam.testRatio = 15/100; 

[net,tr] = train(net,x,t); 

y = net(x); 
performance = perform(net,t,y); 

fprintf('pass 4, feedforwardnet, performance: %f\n', performance); 
fprintf('num_epochs: %d, stop: %s\n', tr.num_epochs, tr.stop); 

Output sau:

pass 1, patternnet, performance: 0.116445 
num_epochs: 353, stop: Validation stop. 
pass 2, feedforwardnet, performance: 0.693561 
num_epochs: 260, stop: Validation stop. 
pass 3, patternnet, performance: 0.116445 
num_epochs: 353, stop: Validation stop. 
pass 4, feedforwardnet, performance: 0.693561 
num_epochs: 260, stop: Validation stop. 

Trả lời

0

Như thường mạng không cư xử mỗi đào tạo hoàn toàn theo cùng một cách. Nó có thể phụ thuộc vào ba (nghĩa là tôi biết ba) lý do:

  1. Khởi tạo ban đầu mạng nơron.
  2. Normalization dữ liệu
  3. Scaling dữ liệu
    Nếu nói về (1) mạng ban đầu được cấu hình với trọng lượng ngẫu nhiên, trong một số phạm vi nhỏ có dấu hiệu khác nhau. Ví dụ tế bào thần kinh với 6 đầu vào có thể nhận được trọng số ban đầu như thế này: 0.1, -0.3, 0.16, -0.23, 0.015, -0.0005. Và điều này có thể dẫn đến một chút kết quả đào tạo khác. Nếu để nói về (2) nếu bình thường của bạn được thực hiện kém thì thuật toán học tập hội tụ với minima địa phương, và không thể nhảy ra khỏi nó. Điều tương tự cũng áp dụng cho trường hợp (3) nếu dữ liệu của bạn cần mở rộng quy mô và bạn không thực hiện.
+0

Vui lòng xem cập nhật của tôi. 1-3 không thể là một lý do, vì kết quả được tái tạo trên nhiều lần chạy: 'patternnet' có hệ thống hoạt động tốt hơn (rõ ràng) cùng' feedforwardnet'. Vì vậy, lý do là (có lẽ) tôi khởi tạo 'feedforwardnet' khác nhau, Câu hỏi đặt ra là: sự khác biệt là gì. –

+0

http://www.mathworks.com/help/nnet/ref/feedforwardnet.html và http://www.mathworks.com/help/nnet/ref/patternnet.html. feedforwardnet phổ biến hơn và dự định nhiều hơn cho các hàm xấp xỉ, trong khi patternnet là nhiều hơn để nhận dạng mẫu. –

+1

Nếu dữ liệu nhiệm vụ của bạn phù hợp hơn với patternnet, thì patternnet sẽ hoạt động tốt hơn và nếu dữ liệu nhiệm vụ của bạn phù hợp hơn với feedforwardnet, thì feedforwardnet sẽ hoạt động tốt hơn. –

1

Hình như hai là không hoàn toàn giống nhau:

>> net = patternnet(hiddenLayerSize); 
>> net2 = feedforwardnet(hiddenLayerSize,'trainscg'); 
>> net.outputs{2}.processParams{2} 

ans = 

    ymin: 0 
    ymax: 1 

>> net2.outputs{2}.processParams{2} 

ans = 

    ymin: -1 
    ymax: 1 

Các net.outputs{2}.processFcns{2}mapminmax vì vậy tôi thu thập mà một trong số đó là tái rộng nó ra để phù hợp với phạm vi sản lượng của dữ liệu thực sự của bạn tốt hơn.

Để tham khảo trong tương lai, bạn có thể làm những điều bẩn thỉu khó chịu như so sánh cấu trúc dữ liệu nội thất bằng cách truyền tới cấu trúc. Vì vậy, tôi đã làm một cái gì đó như

n = struct(net); n2 = struct(net2); 
for fn=fieldnames(n)'; 
    if(~isequaln(n.(fn{1}),n2.(fn{1}))) 
    fprintf('fields %s differ\n', fn{1}); 
    end 
end 

để giúp xác định sự khác biệt.

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