簡體   English   中英

在 Tensorflow 中,我是否需要為“sinc”或“gaussian”激活函數添加新操作?

[英]In Tensorflow, do I need to add new op for "sinc" or "gaussian" activation functions?

我正在使用 Tensorflow 並希望以這樣一種方式訓練權重,使神經元僅在神經元輸出某個范圍內的值時“觸發”,而當輸出值超出該范圍時僅輸出 0 或接近 0范圍。

我正在考慮通過使用“Sinc”(此處)或“Gaussian”(此處)作為激活函數來做到這一點。 不幸的是,Tensorflow 不支持這一點。

我需要為此添加一個新操作嗎? Tensorflow 確實支持實現“Sinc”或“Gaussian”所需的所有操作,因此它們也應該為訓練實現梯度。

我曾嘗試使用它,但不知何故,神經網絡的所有權重和偏差都變為 0。

您可以使用基本的 TF 操作來實現這兩個功能。 我不建議從數學角度(大量的淺層局部最優)在神經網絡中使用周期性激活函數(或“准周期性” - 在一般函數中具有不斷變化的導數符號),因此我建議不要使用 sinc . 就高斯而言,您可能需要很好地處理初始化。 這種“局部函數”的棘手之處在於它們很快就會變為 0,因此您必須確保在提供訓練數據時,您的神經元激活最初處於“活動”部分。 使用基於點積的方法(如 sigmoid、relu 等)會更容易,因為您所要做的就是處理規模。 對於高斯,你實際上必須確保你的激活是“到位”的。

可以作為激活函數傳遞的 sinc 函數。 有點亂,但有效。

def sinc(x):
    atzero = tf.ones_like(x)
    atother = tf.divide(tf.sin(x),x)
    value = tf.where(tf.equal(x,0), atzero, atother )
    return value

高斯:

def gaussian(x):
    sq = tf.square(x)
    neg = tf.negative(sq)
    return tf.exp(neg)

除了上面的 Laine Mikael 的回答之外,我發現這個特殊的 sinc 實現在向后傳遞期間給出了nan 這是基於在 numpy 中實現方式的替代方案:

def sinc(x):
    x = tf.where(tf.abs(x) < 1e-20, 1e-20 * tf.ones_like(x), x)
    return tf.sin(x) / x

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM