我想用簡單的人工神經網絡與反向傳播算法一起工作。我創建了一個ANN,我相信我已經正確實施了BP算法,但我當然可能會錯。簡單的人工神經網絡的問題 - 加入
現在,我試圖通過給它兩個隨機數(a,b)在0和0.5之間來訓練網絡,並讓它添加它們。然後,當然,每次網絡輸出的結果都與a + b的理論答案相比較(這總是可以通過sigmoid函數實現)。
奇怪的是,輸出總是收斂到0和1之間的數字(因爲它必須,因爲sigmoid函數),但是我輸入的隨機數似乎對它沒有影響。
編輯:對不起,它似乎沒有收斂。下面是輸出的圖像:
的權重是隨機分佈的-1和1之間,但我還試圖0和1之間
我還試圖給它兩個恆定數(0.35,0.9),並試圖訓練它吐出0.5。這工作並收斂到0.5。如果我給它0和1之間的任意兩個隨機數,我也訓練它吐出0.5,這也是有效的。
如果相反,我的目標是:
vector<double> target;
target.push_back(.5);
然後收斂速度非常快,甚至與隨機輸入:
我已經嘗試了幾個不同的網絡,因爲我做到了非常容易爲我的網絡添加圖層。我正在使用的標準一個是有兩個輸入,一個是2個神經元,另一個是隻有一個神經元(輸出神經元)。不過,我也嘗試添加幾個圖層,並向它們添加神經元。它似乎沒有改變任何東西。我的學習速率等於1.0,但我試過它等於0.5,並沒有太大的不同。
有沒有人有任何想法我可以嘗試?
這甚至是ANN的能力嗎?我無法想象它不會,因爲他們可以被訓練去做這樣複雜的事情。
有什麼建議嗎?謝謝!
這裏是我訓練它:
//Initialize it. This will be one with 2 layers, the first having 2 Neurons and the second (output layer) having 1.
vector<int> networkSize;
networkSize.push_back(2);
networkSize.push_back(1);
NeuralNetwork myNet(networkSize,2);
for(int i = 0; i<5000; i++){
double a = randSmallNum();
double b = randSmallNum();
cout << "\n\n\nInputs: " << a << ", " << b << " with expected target: " << a + b;
vector<double> myInput;
myInput.push_back(a);
myInput.push_back(b);
vector<double> target;
target.push_back(a + b);
cout << endl << "Iteration " << i;
vector<double> output = myNet.backPropagate(myInput,target);
cout << "Output gotten: " << output[0];
resultPlot << i << "\t" << abs(output[0] - target[0]) << endl;
}
編輯:設置我的網絡,並從本指南中一直遵循:A pdf。我實現了「工作示例3.1」並得到了與他們相同的確切結果,所以我認爲我的實現是正確的,至少就他們而言是如此。
由於神經網絡是建立在連接的神經元和每個神經元是加法器本身加權投入,我認爲你試圖達到的目標有點不明確。因此,要添加兩個數字,必須將網絡的權重設置爲「1」,並且使用標準S形函數時,輸出只能在0或1之間。 – 2011-05-01 12:09:37