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