首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Keras中实现RBF激活函数?

如何在Keras中实现RBF激活函数?
EN

Stack Overflow用户
提问于 2018-12-20 01:00:05
回答 2查看 7.3K关注 0票数 5

我正在创建一个自定义的激活函数,特别是RBF激活函数:

代码语言:javascript
复制
from keras import backend as K
from keras.layers import Lambda

l2_norm = lambda a,b:  K.sqrt(K.sum(K.pow((a-b),2), axis=0, keepdims=True))

def rbf2(x):
X = #here i need inputs that I receive from previous layer 
Y = # here I need weights that I should apply for this layer
l2 = l2_norm(X,Y)
res = K.exp(-1 * gamma * K.pow(l2,2))
return res

函数rbf2接收上一层作为输入:

代码语言:javascript
复制
#some keras layers
model.add(Dense(84, activation='tanh')) #layer1
model.add(Dense(10, activation = rbf2)) #layer2

如何从layer1获取输入,从layer2获取权重,才能创建自定义激活函数?

我实际上想做的是,实现LeNet5神经网络的输出层。LeNet-5的输出层有点特殊,每个神经元输出其输入向量和其权重向量之间的欧几里得距离的平方,而不是计算输入向量和权重向量的点积。

例如,layer1有84个神经元,layer2有10个神经元。在一般情况下,为了计算layer2的10个神经元中的每个神经元的输出,我们对layer1的84个神经元和layer1layer2之间的84个权重进行点积。然后,我们对其应用softmax激活函数。

但在这里,layer2的每个神经元输出的不是点积,而是其输入向量和权重向量之间的欧几里得距离的平方(我想将其用作激活函数)。

任何关于创建RBF激活函数的帮助(计算与层接收的输入和权重的欧几里德距离)并在层中使用它也是有帮助的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-20 18:45:17

为此,您可以简单地使用define a custom layer

代码语言:javascript
复制
from keras.layers import Layer
from keras import backend as K

class RBFLayer(Layer):
    def __init__(self, units, gamma, **kwargs):
        super(RBFLayer, self).__init__(**kwargs)
        self.units = units
        self.gamma = K.cast_to_floatx(gamma)

    def build(self, input_shape):
        self.mu = self.add_weight(name='mu',
                                  shape=(int(input_shape[1]), self.units),
                                  initializer='uniform',
                                  trainable=True)
        super(RBFLayer, self).build(input_shape)

    def call(self, inputs):
        diff = K.expand_dims(inputs) - self.mu
        l2 = K.sum(K.pow(diff,2), axis=1)
        res = K.exp(-1 * self.gamma * l2)
        return res

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.units)

示例用法:

代码语言:javascript
复制
model = Sequential()
model.add(Dense(20, input_shape=(100,)))
model.add(RBFLayer(10, 0.5))
票数 8
EN

Stack Overflow用户

发布于 2019-09-26 20:54:19

这里没有必要重新发明轮子。custom RBF layer for Keras已存在。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53855941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档