簡體   English   中英

如何為圖層中的每個節點分配 Keras relu 函數的自定義 alpha?

[英]How can I assign a custom alpha for Keras relu function, for each node in a layer?

我想為每個 Keras 激活函數添加一個特定於節點的變量。 我希望每個節點都使用不同的值 ( alpha ) 計算激活值(輸出)。

這可以全局完成,例如使用 relu 激活函數的alpha參數( 鏈接):

# Build Model
...
model.add(Dense(units=128))
model.add(Activation(lambda x: custom_activation(x, alpha=0.1)))
...

我也可以寫一個自定義的激活函數,但是alpha參數也是全局的。 鏈接

# Custom activation function
def custom_activation(x, alpha=0.0):
    return (K.sigmoid(x + alpha))

# Build Model
...
model.add(Dense(units=128))
model.add(Activation(lambda x: custom_activation(x, alpha=0.1)))
...

在自定義函數中,我目前只能訪問以下變量:

(Pdb) locals()
{'x': <tf.Tensor 'dense/Identity:0' shape=(None, 128) dtype=float32>, 'alpha': 0.1}

我想使用自定義激活函數,但alpha對於網絡中的每個節點都是唯一的。 例如,如果層中有 128 個單元,那么我希望也有 128 個 alpha 值,每個單元/節點一個。 然后我希望激活函數

如何創建圖層中每個單元/節點唯一的alpha值?

我不建議為那個使用 lambda 層,它太駭人聽聞了。 我建議你寫你自己的圖層如下:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# Custom layer 
class CustomAct(tf.keras.layers.Layer):

    def __init__(self):
        super(CustomAct, self).__init__()

    def build(self, input_shape):
        self.alpha = self.add_weight(name='alpha', 
                                      shape=[input_shape[1], ],
                                      initializer='uniform',
                                      trainable=True)
        super(CustomAct, self).build(input_shape)

    def call(self, x):
        return tf.sigmoid(x+self.alpha)

    def get_alpha(self):
        return self.alpha        

inputs = np.random.random([16, 32]).astype(np.float32)

# Model 
model = tf.keras.models.Sequential()
model.add(tf.keras.Input(inputs.shape[-1]))
model.add(tf.keras.layers.Dense(128))
model.add(CustomAct())

# Test
model.compile(loss="MSE")


alpha_after_initialization = model.layers[-1].get_alpha()
plt.plot(alpha_after_initialization.numpy())

x = np.random.random([18, 32])
y = np.random.random([18, 128])
for _ in range(20):
    model.fit(x, y)

out_after_20_steps = alpha_after_initialization = model.layers[-1].get_alpha()
plt.plot(alpha_after_initialization.numpy())

plt.show()

當然,您應該將所有 tf 引用更改為您的 keras 引用。

暫無
暫無

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

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