簡體   English   中英

如何在不初始化的情況下將 tf.keras.layers.layer 分配給一個類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM