tensorflow Python角:将y/target传递给自定义激活函数

vfh0ocws  于 2022-11-25  发布在  Python
关注(0)|答案(1)|浏览(150)

我想将我的Python Keras模型y(目标/响应/等)传递给自定义激活。
将拟合范围限制在下限上限之间的自定义激活函数为:

def activation_range(x, lower=-1, upper=1) :

    """
    Custom activation layer to restrict layer output range
    """

    x02 = backend.tanh(x) + 1 # x in range(0,2)
    scale = (upper-lower)/2
    return  x02 * scale + lower

我必须把它传给Keras同时启动一个跟踪

model.add(keras.layers.Dense(1, activation=lambda x: activation_range(x, lower=lower, upper=upper)))

其中,在调用www.example.com函数之前计算上限和下限model.fit。
然而,是否有一种方法可以在模型初始化后根据y的值(例如lower = y.min()upper = y.max())设置上限和下限,因此Keras在根据y进行拟合时计算上限和下限(在运行model.fit时),而不是在之前将其传递给Keras

rhfm7lfc

rhfm7lfc1#

你可以。只要使用 functional API 结合 subclassed layers,而不是基本的Sequential,后者只支持单输入单输出模型。注意,这需要你将(x,y)作为x参数传递给model.fit,同时也作为推理过程中的输入。

import tensorflow as tf
import numpy as np

class CustomActivation(tf.keras.layers.Layer):
    def call(self, inp):
        x, y = inp
        upper = tf.math.reduce_max(y)
        lower = tf.math.reduce_min(y)
        return (tf.math.tanh(x) + 1) * (upper - lower) / 2 + lower

x_in = tf.keras.layers.Input(shape=(10,))
y_in = tf.keras.layers.Input(shape=(1,))
x_before_act = tf.keras.layers.Dense(units=1, activation=None)(x_in)
x_after_act = CustomActivation()([x_before_act, y_in])
model = tf.keras.models.Model(inputs=[x_in, y_in], outputs=x_after_act)

您可以使用下面的示例验证这一点,并看到模型的输出始终介于-10和10之间。

x = np.random.normal(size=(32,10))
y = np.random.randint(low=-10, high=10, size=(32,))
model([x,y])

您也可以编译和训练模型。

model.compile(optimizer=tf.keras.optimizers.SGD(), loss=tf.keras.losses.mse)
model.fit(x=(x,y), y=y, epochs=1)

相关问题