我正在尝试开发自定义Keras图层以构建基于径向的网络。 我从这篇文章开始:RBN and Keras Layer
我想使用KMeans群集训练网络,因此Keras层不需要“可训练”。因此,我对RBN的中心进行了预训练,然后将其用于内核操作。我没有使用add_weight方法构建图层,而是创建了一个变量K.variable(centers)。
在下面的代码中,我创建了具有7个功能的随机数据X。具有9个中心的RBN(具有KMeans的预训练中心)。调用方法应将输入数据内核化。
问题 我不知道如何使用中心(“ self.mu”)来操作张量“输入”。 安装时出现错误:
ValueError: Dimensions must be equal, but are 9 and 7 for 'dense_94/MatMul' (op: 'MatMul') with input shapes: [1,9], [7,15].
def call(self, inputs):
diff = K.expand_dims(inputs,0) - K.expand_dims(self.mu,0)
l2 = K.sum(K.pow(diff, 2), axis=-1)
res = K.exp(-1 * self.gamma * l2)
return res
代码:
from keras.layers import Layer
from keras import backend as K
import numpy as np
from keras.layers import Dense
from keras.models import Sequential
from keras.losses import binary_crossentropy
from keras.utils import to_categorical
from sklearn.cluster import KMeans
class RBFLayer(Layer):
def __init__(self, centers, gamma, **kwargs):
super(RBFLayer, self).__init__(**kwargs)
self.units = centers.shape[0]
self.gamma = K.cast_to_floatx(gamma)
self.centers = centers
def build(self, input_shape):
self.mu = K.variable( self.centers, name='mu')
# 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,0) - K.expand_dims(self.mu,0)
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)
X = np.random.randint(0,high=10, size=(50,7))
C = KMeans(n_clusters=9).fit(X).cluster_centers_
y = np.random.randint(0,high=4,size=(50,1))
y = to_categorical(y,num_classes=4)
model = Sequential()
model.add(RBFLayer(C,0.5))
model.add(Dense(15, activation='relu'))
model.add(Dense(4, activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy')
model.fit(X, y, epochs=3)