Если вы объявляете веса в def build (self, input_shape):, то вам нужно «использовать» все веса после вызова tf.py_func.
import tensorflow as tf
from keras import backend as K
from keras.engine.topology import Layer
class MultiplyLayer(Layer):
def __init__(self, **kwargs):
super(MultiplyLayer, self).__init__(**kwargs)
def build(self, input_shape):
self.filters = self.add_weight(name='Filters', shape=(1, input_shape[1]), initializer='uniform', trainable=True)
super(MultiplyLayer, self).build(input_shape) # Be sure to call this at the end
def call(self, x):
xw = x * self.filters
def my_func(x):
return 5 * x
X = tf.py_func(my_func, [xw], tf.float32)
return X + (self.filters - self.filters)
def compute_output_shape(self, input_shape):
return (input_shape)
def get_model():
model = Sequential()
model.add(MultiplyLayer(input_shape=(num_features,)))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy'])
return model
model = get_model()
model.summary()
model.fit(X_train, y_train_hot, batch_size=batch_size, epochs=epochs, verbose=verbose, validation_data=(X_test, y_test_hot))