强制Keras创建自定义图层的不同实例

时间:2018-05-24 18:03:53

标签: python tensorflow keras keras-layer keras-2

我写了一个Keras自定义图层foo(其中没有可训练的权重),它接受输入x并返回x + n,其中n是加性高斯白噪声具有预先规定的标准偏差。我希望训练我的功能模型model-trg,其中包括foo,实例化的噪音水平设置为sigma-trg(在训练阶段)。在测试模型model-test中,我复制model-trgfoo之外的所有可训练图层。在model-test中,我想创建第二个不同的foo实例,参数sigma-testsigma-trg不同。目标是测试训练后的模型是否能够推广其针对不同噪声水平的学习。

令人惊讶的是,当我打印model-trgmodel-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

0 个答案:

没有答案