[英]How to assign a tf.keras.layers.layer to a class without initializing it?
我在一個班級上工作以創建各種對稱的 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)
這可能是一個錯誤。 這是一個類似的問題(如果您將未實例化的類放入列表並嘗試__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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.