gpt4 book ai didi

python - 如何将 tf.keras.layers.layer 分配给一个类而不初始化它?

转载 作者:行者123 更新时间:2023-12-01 07:56:18 35 4
gpt4 key购买 nike

我正在开发一个类来创建各种对称 AE。我现在把这个类移植到TF 2.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'

最佳答案

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

self.keras_layer = keras_layer

代码可以工作:

import tensorflow as tf

class CoderLayer(tf.keras.layers.Layer):
def __init__(self, name, keras_layer):
super(CoderLayer, self).__init__(name=name)
self.out = keras_layer(12, [3, 3])

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)
print(layer(inputs))
# Tensor("minimal_example_3/conv2d_12/BiasAdd:0", shape=(12, 198, 198, 12), dtype=float32)

这可能是一个错误。 This是一个已经提出的类似问题(如果您将未实例化的类放入列表中并尝试 __setattr__() 您将得到相同的异常)。

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

class CoderLayer(tf.keras.layers.Layer):
def __init__(self, name, layername):
super(CoderLayer, self).__init__(name=name)
self.layer = layername
self.out = tf.keras.layers.__dict__[layername](1, 2)

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

inputs = tf.random.normal([1, 3, 3, 1])
layer = CoderLayer("mylayer", 'Conv2D')
layer(inputs).numpy()

关于python - 如何将 tf.keras.layers.layer 分配给一个类而不初始化它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55965135/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com