Заставить Keras создать другой экземпляр пользовательского слоя - PullRequest
0 голосов
/ 24 мая 2018

Я написал пользовательский слой Keras foo (в нем нет обучаемых весов), который принимает входные данные x и возвращает x + n, где n - аддитивный белый гауссов шум с заранее заданным стандартным отклонением.Я хочу тренировать свою функциональную модель model-trg, которая включает в себя foo, для которой установлен уровень шума sigma-trg (на этапе обучения).В тестовой модели model-test я дублирую все обучаемые слои model-trg, кроме foomodel-test я хотел бы создать второй другой экземпляр foo с параметром sigma-test, отличным от sigma-trg.Цель состоит в том, чтобы проверить, способна ли модель после обучения обобщить свое обучение для различных уровней шума.

Удивительно, но когда я печатаю сводку model-trg и model-test, они, похоже, используют foo как совместно используемый уровень, т.е. параметр стандартного отклонения для model-test, по-видимому, установлен идентично параметру стандартного отклонения в model-trg.Конечным результатом является то, что производительность моей тестовой модели ничем не отличается от производительности моей обучающей модели.

Есть ли какие-либо предложения о том, как заставить Keras во время компиляции избегать создания общих слоев, если параметры в этом слоеотличается в модели обучения и тестирования?

Совместное использование слоев в разных моделях

if enable_trg is True:
     model_trg = Model(inputs=source_input, outputs= preds)
     # some code specifying the layers and connections
     # some code to compile and train the model
     model_trg.save_weights(model_name + '.h5') # save weights

if enable_test is True: 
    model_trg.load_weights(model_name + '.h5')    
    model_test= Model(inputs=source_input, outputs = preds)

Модель обучения

y = foo(batch_size=trg_batch_size,noise_stdev=stdev_trg)(x)

Тестовая модель

y = foo(batch_size=test_batch_size,noise_stdev=stdev_test)(x)

Customслой

class Foo(Layer): 
    def __init__(self, batch_size, noise_stdev, **kwargs):
        super(Foo, self).__init__(**kwargs)        
        self.batch_size = batch_size
        self.stdev = noise_stdev                
        self.supports_masking = True

    def build(self,inputShape):
        super(Foo,self).build(inputShape)

    def call(self, inputs, training=None):                      
        y = inputs[0]
        noise = K.random_normal(shape=K.shape(y),mean=0.,stddev=self.stdev) 
        return y + noise

    def get_config(self):
        config = {
                'batch_size': self.batch_size,
                'noise_stdev': self.stdev                
                 }
        base_config = super(Foo, self).get_config()        
        return dict(list(base_config.items()) + list(config.items()))

    def compute_output_shape(self, input_shape):
        return input_shape
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...