要实现Concrete Dropout,Keras implementation定义了一个包装器层,该包装器会给要包装的层增加损耗。损耗取决于输入尺寸。我的问题如下:我希望包装2D卷积层,但是网络是完全卷积的,并且对于不同的图像(例如形状(None,None,None,256)),输入大小可能不同,这意味着build()函数的包装器不再起作用:
def build(self, input_shape=None):
self.input_spec = InputSpec(shape=input_shape)
if not self.layer.built:
self.layer.build(input_shape)
self.layer.built = True
super(ConcreteDropout, self).build()
[...]
input_dim = np.prod(input_shape[1:]) # <-- Problem occurs here,
# input_shape := (None, None, None, 256)
[...]
self.layer.add_loss(regularizer) # where regularizer depends on input_dim
我尝试使用self.layer.input和self.layer.input_shape在运行时获取输入形状,但这会产生类似错误的信息
*** AttributeError: Layer pyramid_classification_0 is not connected, no input to return.
有什么方法可以使它适用于可变的输入大小?