Python 如何在不初始化类的情况下将tf.keras.layers.layer分配给类?
我在一个类中创建各种对称AE。我现在将这个类移植到TF2.0,它比我想象的要复杂。然而,我使用层和模型的子类化来实现这一点。因此,我想将几个keras层分组为一个keras层。但是如果我想写这样的东西: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
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()
请包含完整的回溯,一个可复制的例子就好了,我不清楚问题出在哪里。