我正在實現一個神經網絡,並希望使用ReLU作爲神經元的激活函數。此外,我正在使用SDG和反向傳播來訓練網絡。我正在用範例異或問題測試神經網絡,到目前爲止,如果我使用邏輯函數或雙曲線正切作爲激活函數,它會正確分類新樣本。使用ReLU作爲激活函數的注意事項
我一直在閱讀有關使用破RELU作爲激活功能的優勢,並實現它,在Python中,類似這樣的:
def relu(data, epsilon=0.1):
return np.maximum(epsilon * data, data)
其中np
是NumPy的名稱。相關的衍生實現這樣的:
def relu_prime(data, epsilon=0.1):
if 1. * np.all(epsilon < data):
return 1
return epsilon
使用此功能激活我得到不正確的結果。例如:
輸入= [0,0] - >輸出= [0.43951457]
輸入= [0,1] - >輸出= [0.46252925]
輸入= [1,0] - >輸出= [0.34939594]
輸入= [1,1] - >輸出= [0.37241062]
可以看出,輸出與預期的異或運算有很大不同。所以問題是,有沒有特別的考慮使用ReLU作爲激活函數?
請不要猶豫,問我更多的上下文或代碼。提前致謝。
編輯:衍生物中存在一個錯誤,因爲它只返回一個浮點值,而不是NumPy數組。正確的代碼應該是:
def relu_prime(data, epsilon=0.1):
gradients = 1. * (data > epsilon)
gradients[gradients == 0] = epsilon
return gradients
修改了梯度計算部分後,它是否工作? –
@KrishnaKishoreAndhavarapu修改後,我得到正確的結果,但像10次中的5次。我相信我每次都應該得到正確的結果。這種激活功能顯然是我缺少的東西。 – tulians
你確定'gradients = 1。*(data> epsilon)'是有意義的嗎?什麼是你的泄漏ReLU功能的定義?對於大於零的某些數據值,這會將梯度設置爲等於epsilon。 –