2012-01-09 207 views
3

這裏是我的代碼(在MLP網絡中的神經元):神經網絡的激活/輸出

double summation = 0; 
for (int i = 0; i < weights.length; i++) { 
    summation += inputs[i] * weights[i]; 
} 

double normalized = Math.tanh(summation); 
if (normalized > 0.9 || normalized < -0.9) { 
    activated = 1; 
} else { 
    activated = 0; 
} 

我認爲這是不正確。輸出應該是歸一化的值,還是總是限制爲0或1?

+1

這取決於..... – 2012-01-09 00:56:41

+0

你能詳細點嗎? – 2012-01-09 00:57:54

+0

不同型號使用不同的激活功能。 – 2012-01-09 01:01:09

回答

1

可能可以通過輸出的跡象,但通常情況下,一個神經元的輸出要求是連續可微,所以-1到1之間(一個真正的價值,因爲你所選擇的正切函數)會更合適,特別是如果您要使用反向傳播來訓練模型。

+0

所以我會說:activated = Math.tanh(summation); ? – 2012-01-09 01:02:49

+0

這是獲得-1和1之間連續的,可微分輸出的一種方法。 – 2012-01-09 01:03:40

+0

是的,但這樣做是正確的嗎?我不認爲將0或1分配給輸出將非常有效。 – 2012-01-09 01:04:41

2

常見的激活函數是Sigmoid。這很好,因爲它可以壓縮兩個邊界之間的神經元值。所以,總結了所有的值,然後應用您激活功能

這裏是我的代碼我的雙曲線函數的摘錄:

/** 
* シグモイド関數: Sigmoid function 
*/ 
private double sigmoid(double x) { 
    return (1.0/(1 + Math.exp(-x))); 
} 

還檢查了神經網絡的我Github上的例子(代碼中的Java,C++也可用版本) https://github.com/kennycason/neuralnetwork/ https://github.com/kennycason/ml

0

有一個神經元沒有「正確的」激活功能。你想要的是一個函數,它夾在兩個值之間,並單調遞增。雙曲正切函數(您的「標準化」函數)可以很好地完成此任務,輸出不會從-1運行到1,因爲輸入會從-inf運行到+ inf。

雖然有一些常見的激活功能。一個符號函數(如果輸入小於零,則輸出負值,否則輸出一)也是有效的。另一個是Kenny Cason提到的邏輯曲線,但請注意,實際上可以將Kenny函數中的-x替換爲-kx,其中k是某個常數。通過這種方式,您可以生成一系列S形曲線,並在零點附近有一個更緊密或更鬆散的過渡區域。

沒有一個比另一個更「正確」。 (除非你正在做反向傳播,在這種情況下,signum函數是不可區分的,並且不適用於你。)

但是,那就是說,我不明白你的「if」語句在做什麼。看起來您正在創建一個函數,從一個下移到零,並在輸入從-inf移動到+ inf時備份到一個函數。這不是你想要的。 (如果你從負數到零到正數,那就沒問題了。)