【问题标题】:Dynamic Activation Function in KerasKeras 中的动态激活函数
【发布时间】:2019-09-10 06:33:11
【问题描述】:

我正在从事一个研究项目,该项目涉及用多项式激活替换某些 ReLu 激活。我继承的代码是使用带有 TensorFlow 后端的 Keras - 我对此没有什么经验。

基本上我正在构建一个普通的 ResNet 图,我需要逐渐用自定义函数替换一些 ReLus。换句话说,我的自定义激活需要执行以下操作:

def activation(x)
    approx = .1992 + .5002*x + .1997*x**2
    relu = tf.nn.relu(x)
    diff = (TOTAL_EPOCHS - CURRENT_EPOCH) / TOTAL_EPOCHS
    return (1-diff)*approx + diff*relu

我遇到的问题是弄清楚如何使用 keras 和 model.fit 通过当前时代使函数动态化。我已经尝试了一些事情,比如定义一个自定义层,传递一个计数器变量,并尝试使用 tensorflow 的全局 step 变量,但每次尝试都会遇到烦人的错误。我想知道是否有一种我忽略的简单方法可以做到这一点?看起来这应该是微不足道的,但我只是缺乏框架的经验。

【问题讨论】:

    标签: tensorflow keras keras-layer


    【解决方案1】:

    您可以使用 keras.callbacks.Callback 使用 keras 和 model.fit 通过当前纪元使函数动态化。这是一个使激活函数的返回值等于当前时期的示例。从 MSE 值可以很快看出当前 epoch 参与了激活函数的计算。

    from keras.models import Model
    from keras.layers import Activation,Input
    from keras.utils.generic_utils import get_custom_objects
    import keras.backend as K
    from keras.callbacks import Callback
    
    class MonitorCallback(Callback):
        def __init__(self, CURRENT_EPOCH):
            self.parm = CURRENT_EPOCH
        def on_epoch_begin(self, epoch, logs=None):
            K.set_value(self.parm, epoch)
    
    CURRENT_EPOCH = K.variable(0)
    TOTAL_EPOCHS = 8
    def custom_activation(x):
        return CURRENT_EPOCH
    
    num_input = Input(shape=(1,))
    get_custom_objects().update({'custom_activation': Activation(custom_activation)})
    output = Activation(custom_activation)(num_input)
    model = Model(num_input,output)
    model.compile(optimizer='rmsprop',loss='mse',metrics=['mse'])
    
    model.fit(x=[1],y=[2],epochs=TOTAL_EPOCHS,callbacks=[MonitorCallback(CURRENT_EPOCH)])
    
    # print
    Using TensorFlow backend.
    Epoch 1/8
    1/1 [==============================] - 2s 2s/step - loss: 4.0000 - mean_squared_error: 4.0000
    Epoch 2/8
    1/1 [==============================] - 0s 2ms/step - loss: 1.0000 - mean_squared_error: 1.0000
    Epoch 3/8
    1/1 [==============================] - 0s 2ms/step - loss: 0.0000e+00 - mean_squared_error: 0.0000e+00
    Epoch 4/8
    1/1 [==============================] - 0s 2ms/step - loss: 1.0000 - mean_squared_error: 1.0000
    Epoch 5/8
    1/1 [==============================] - 0s 3ms/step - loss: 4.0000 - mean_squared_error: 4.0000
    Epoch 6/8
    1/1 [==============================] - 0s 3ms/step - loss: 9.0000 - mean_squared_error: 9.0000
    Epoch 7/8
    1/1 [==============================] - 0s 3ms/step - loss: 16.0000 - mean_squared_error: 16.0000
    Epoch 8/8
    1/1 [==============================] - 0s 3ms/step - loss: 25.0000 - mean_squared_error: 25.0000
    

    请记住,keras.callbacks.Callback 中的纪元从零开始计数。您可以尝试将custom_activation 替换为您的激活函数。

    【讨论】:

    • 成功了——非常感谢!!节省了我很多时间:)
    猜你喜欢
    • 2017-08-10
    • 2020-12-05
    • 2020-07-04
    • 2017-11-03
    • 2023-03-13
    • 1970-01-01
    • 2021-07-30
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多