Python 如何在不初始化类的情况下将tf.keras.layers.layer分配给类?

Python 如何在不初始化类的情况下将tf.keras.layers.layer分配给类?,python,tensorflow,keras,Python,Tensorflow,Keras,我在一个类中创建各种对称AE。我现在将这个类移植到TF2.0,它比我想象的要复杂。然而,我使用层和模型的子类化来实现这一点。因此,我想将几个keras层分组为一个keras层。但是如果我想写这样的东西: def __init__(self, name, keras_layer, **kwargs): self.keras_layer = tf.keras.layer.Conv2D super(CoderLayer, self).__init__(name=name, **kwar

我在一个类中创建各种对称AE。我现在将这个类移植到TF2.0,它比我想象的要复杂。然而,我使用层和模型的子类化来实现这一点。因此,我想将几个keras层分组为一个keras层。但是如果我想写这样的东西:

def __init__(self, name, keras_layer, **kwargs):
    self.keras_layer = tf.keras.layer.Conv2D
    super(CoderLayer, self).__init__(name=name, **kwargs)
我得到以下错误,因为tf想要使用这个未初始化的层:

TypeError: _method_wrapper() missing 1 required positional argument: 'self'
我也试着把它写在一个列表中,但它也不起作用

编辑

下面是一个有效的示例和完整的回溯:

import tensorflow as tf
print(tf.__version__) # 2.0.0-alpha0

class CoderLayer(tf.keras.layers.Layer):

    def __init__(self, name, keras_layer):
        self.keras_layer = keras_layer
        self.out = keras_layer(12, [3, 3])
        super(CoderLayer, self).__init__(name=name)

    def call(self, inputs):
        return self.out(inputs)

inputs = tf.keras.Input(shape=(200, 200, 3), batch_size=12)
layer = CoderLayer("minimal_example", tf.keras.layers.Conv2D)

layer(inputs)
回溯:

Traceback (most recent call last):
  File "..\baseline_cae.py", line 24, in <module>
    layer(inputs)
  File "..\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 581, in __call__
    self._clear_losses()
  File "..\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\training\tracking\base.py", line 456, in _method_wrapper
    result = method(self, *args, **kwargs)
  File "..\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 818, in _clear_losses
    layer._clear_losses()
TypeError: _method_wrapper() missing 1 required positional argument: 'self'
回溯(最近一次呼叫最后一次):
文件“.\baseline_cae.py”,第24行,在
图层(输入)
文件“.\AppData\Local\Continuum\anaconda3\lib\site packages\tensorflow\python\keras\engine\base\u layer.py”,第581行,在调用中__
自清损失()
文件“.\AppData\Local\Continuum\anaconda3\lib\site packages\tensorflow\python\training\tracking\base.py”,第456行,在方法包装中
结果=方法(自身、*args、**kwargs)
文件“.\AppData\Local\Continuum\anaconda3\lib\site packages\tensorflow\python\keras\engine\base\u layer.py”,第818行,在_clear\u loss中
层。_清除_损失()
TypeError:\u方法\u包装器()缺少1个必需的位置参数:“self”

问题在于将未实例化的类设置为
tf.keras.layers.Layer
子类中的属性。如果删除以下行

self.keras\u layer=keras\u layer

该守则将起作用:

将tensorflow导入为tf
类别代码层(tf.keras.layers.Layer):
定义初始层(自身、名称、keras层):
超级(CoderLayer,self)。\uuuuu初始化(name=name)
self.out=keras_层(12、[3,3])
def呼叫(自我,输入):
返回自输出(输入)
输入=tf.keras.Input(形状=(2002003),批次大小=12)
layer=CoderLayer(“最小示例”,tf.keras.layers.Conv2D)
打印(图层(输入))
#张量(“最小值”示例3/conv2d\u 12/BiasAdd:0),形状=(12,198,198,12),数据类型=float32)
这可能是一个错误。是一个已经提出的类似问题(如果您将未实例化的类放入列表并尝试
\uu setattr\uu()
,您将得到相同的异常)

如果要使用多个图层,这可能是一种可行的解决方法:

class CoderLayer(tf.keras.layers.Layer):
定义初始(自我、名称、层名称):
超级(CoderLayer,self)。\uuuuu初始化(name=name)
self.layer=layername
self.out=tf.keras.layers.\uuu dict\uuuu[layername](1,2)
def呼叫(自我,输入):
返回自输出(输入)
输入=tf.random.normal([1,3,3,1])
layer=CoderLayer(“mylayer”,“Conv2D”)
图层(输入).numpy()

请包含完整的回溯,一个可复制的例子就好了,我不清楚问题出在哪里。