我正在创建自定义的激活功能,尤其是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个神经元。在一般情况下,为了计算layer2
的10个神经元中每个神经元的输出,我们对layer1
的84个神经元与layer1
和layer2
之间的84个权重进行点积运算。然后,我们在其上应用softmax
激活功能。
但是在这里,layer2
的每个神经元都没有进行点积运算,而是输出其输入向量与其权重向量之间的欧几里得距离的平方(我想将其用作激活函数)。
任何有关创建RBF激活函数(计算距图层接收的输入和权重的欧几里得距离)并在图层中使用它的帮助都将有所帮助。
答案 0 :(得分:4)
您可以为此简单地define a custom layer:
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))
答案 1 :(得分:0)
这里不需要重新发明轮子。 custom RBF layer for Keras已经存在。