带有附加参数/参数的 Keras 自定义激活函数

时间:2021-02-17 15:31:09

标签: python tensorflow machine-learning keras

如何在 keras 中定义一个需要额外参数的激活函数。 我最初的自定义激活函数是一个函数,它根据 N 度的多项式生成点。输入是多项式的系数。它看起来像这样:

def poly_transfer(x):
    a = np.arange(0, 1.05, 0.05)
    b = []
    for i in range(x.shape[1]):
        b.append(a**i)
    b = np.asarray(b)
    b = b.astype(np.float32)
    c = matmul(x,b)
    return c

现在我想从函数外部设置输出的长度。有点像这样:

def poly_transfer(x, lenght):
    a = np.arange(0, lenght + 0.05, 0.05)
    b = []
    for i in range(x.shape[1]):
        b.append(a**i)
    b = np.asarray(b)
    b = b.astype(np.float32)
    c = matmul(x,b)
    return c

我如何实现这个功能以及如何使用它? 目前:

speed_out = Lambda(poly_transfer)(speed_concat_layer)

正如我想象的那样:

speed_out = Lambda(poly_transfer(lenght=lenght))(speed_concat_layer)

2 个答案:

答案 0 :(得分:1)

您可以使用 functools.partial 来柯里化函数:

from functools import partial

poly_transfer_set_length = partial(poly_transfer, lenght=lenght)
speed_out = Lambda(poly_transfer_set_length)(speed_concat_layer)

或使用 lambda 函数:

speed_out = Lambda(lambda x: poly_transfer(x, lenght=lenght))(speed_concat_layer)

答案 1 :(得分:1)

你可以用这种方式简单地做...

X = np.random.uniform(0,1, (100,10))
y = np.random.uniform(0,1, (100,))

def poly_transfer(x, lenght):

    a = np.arange(0, lenght + 0.05, 0.05)

    b = []
    for i in range(x.shape[1]):
        b.append(a**i)

    b = tf.constant(np.asarray(b), dtype=tf.float32)
    c = tf.matmul(x, b)

    return c

inp = Input((10,))
poly = Lambda(lambda x: poly_transfer(x, lenght=1))(inp)
out = Dense(1)(poly)

model = Model(inp, out)
model.compile('adam', 'mse')
model.fit(X, y, epochs=3)