我写了一个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)
自定义图层
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