2011-12-19 68 views
2

我用Matlab神經網絡工具包實現多層感知器時遇到了問題。Matlab神經網絡 - 結果不好

我嘗試實現神經網絡,它將識別存儲爲二進制圖像(大小40x50)的單個字符。 圖像被轉換成二進制向量。輸出以6位編碼。我用簡單newff功能以這種方式(與在隱藏層30個感知):

net = newff(P, [30, 6], {'tansig' 'tansig'}, 'traingd', 'learngdm', 'mse');

然後我訓練我的網絡與字符的打在3名不同的字體,用以下的列車參數:

net.trainParam.epochs=1000000; 
net.trainParam.goal = 0.00001; 
net.traxinParam.lr = 0.01; 

經過訓練網絡正確識別訓練集中的所有字符,但是... 它無法識別來自其​​他字體的更多兩次字符。

我該如何改善這個簡單的網絡?

回答

1

你有一個非常大的數量的輸入變量(2000,如果我理解你的描述)。我的第一個建議是儘可能減少這個數字。一些可能的技術包括:對輸入變量進行二次採樣或計算信息特徵(例如行和列總數,這會將輸入向量減少到90 = 40 + 50)

此外,您的輸出編碼爲6位, 32個可能的組合值,所以我假設你使用這些來代表26個字母?如果是這樣,那麼你可能會更好地用另一個輸出表示。考慮到看起來沒有任何相似之處的各種字母將在比特1上共享1的值,使得從輸入到輸出的映射覆雜化。每個類有1位的輸出表示會簡化事情。

0

您可以使用patternnet而不是newff,這會創建一個更適合模式識別的網絡。由於目標函數使用一個26元素的向量,在右邊的字母位置上有1(其他地方爲0)。識別的輸出將是一個介於0和1之間的26個實數的向量,其中識別的字母具有最高值。

確保使用來自所有字體的數據進行培訓。

給作爲輸入的所有數據集,train將根據指定的百分比會自動將其分爲列車驗證試驗檯:

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

(選擇你自己的百分比)。

然後測試僅使用測試集,你可以找到自己的指數納入

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