Как реализовать функцию активации RBF в Keras?

Я создаю настраиваемую функцию активации, в частности функцию активации 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

Функция rbf2 принимает на вход предыдущий слой:

#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 нейронов. В общих случаях для расчета выходных данных для каждого из 10 нейронов layer2 мы производим скалярное произведение 84 нейронов с layer1 и 84 весами между layer1 и layer2. Затем мы применяем к нему softmax функцию активации.

Но здесь, вместо скалярного произведения, каждый нейрон layer2 выводит квадрат евклидова расстояния между его входным вектором и вектором веса (я хочу использовать это в качестве своей функции активации).

Также полезна любая помощь по созданию функции активации RBF (вычисление евклидова расстояния от входных данных, которые получает слой и весов) и ее использование в слое.


person Vamshi Pulluri    schedule 19.12.2018    source источник
comment
Вы имеете в виду, что хотите получить вывод layer1 и layer2 и передать его своей функции rbf? Если это так, то уверены ли вы, что это будет работать с текущим определением вашей функции активации, поскольку они имеют разные формы?   -  person today    schedule 19.12.2018
comment
На самом деле я пытаюсь реализовать выходной слой для нейронной сети LeNet5. Выходной слой LeNet-5 немного особенный: вместо вычисления скалярного произведения входных данных и весового вектора каждый нейрон выводит квадрат евклидова расстояния между своим входным вектором и своим весовым вектором.   -  person Vamshi Pulluri    schedule 20.12.2018
comment
Короче говоря, мне нужны выходные данные layer1 и веса каждого нейрона layer2. и я хочу вычислить евклидово расстояние между ними.   -  person Vamshi Pulluri    schedule 20.12.2018
comment
Гамма - это единственный параметр для каждого нейрона или вектор? Думаю, это единичный параметр.   -  person today    schedule 20.12.2018
comment
Да, это единственный параметр. Я использую гамму = 1   -  person Vamshi Pulluri    schedule 20.12.2018


Ответы (2)


Вы можете просто определить собственный слой для этой цели:

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)

Пример использования:

model = Sequential()
model.add(Dense(20, input_shape=(100,)))
model.add(RBFLayer(10, 0.5))
person today    schedule 20.12.2018
comment
Комментарии не подлежат расширенному обсуждению; этот разговор был переехал в чат. - person Samuel Liew♦; 21.12.2018
comment
Может кто-нибудь объяснить, что такое гамма, kwargs, self.mu? - person Navan K.; 19.06.2021

Здесь нет необходимости изобретать велосипед. настраиваемый слой RBF для Keras уже существует.

person Hagbard    schedule 26.09.2019