如何在Keras中实现RBF激活功能?

Vam*_*uri 3 python machine-learning conv-neural-network keras activation-function

我正在创建自定义的激活功能,尤其是RBF激活功能:

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
Run Code Online (Sandbox Code Playgroud)

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

#some keras layers
model.add(Dense(84, activation='tanh')) #layer1
model.add(Dense(10, activation = rbf2)) #layer2
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能获得输入layer1和权重layer2以创建定制的激活功能?

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

例如,layer1具有84个神经元和layer210个神经元。在一般情况下,用于计算输出的每个的10个的神经元layer2,我们做的84个神经元的点积layer1和84层之间的权重layer1layer2。然后,我们对其应用softmax激活功能。

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

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

tod*_*day 5

您可以为此简单定义一个自定义层

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)
Run Code Online (Sandbox Code Playgroud)

用法示例:

model = Sequential()
model.add(Dense(20, input_shape=(100,)))
model.add(RBFLayer(10, 0.5))
Run Code Online (Sandbox Code Playgroud)