带有Keras自定义层的径向基网络

时间:2019-08-31 21:06:30

标签: tensorflow keras neural-network

我正在尝试开发自定义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)

0 个答案:

没有答案