Как реализовать функцию активации RBF в Керасе?
Я создаю настраиваемую функцию активации, в частности функцию активации 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 (вычисление евклидова расстояния от входов, которые получает и взвешивает слой) и использование ее в слое также полезна.
1 ответ
Вы можете просто определить пользовательский слой для этой цели:
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))
Здесь нет необходимости изобретать велосипед. Пользовательский RBF слой для Keras уже существует.