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