使用 Keras 子类化创建自动编码器模型

Create Autoencoder Model Using Keras Subclassing

我想创建一个自动编码器子classing Keras 模型 class,我不知道是否可以分别创建编码器和解码器并将它们组合成一个new AutoEncoder class 或者我需要在同一个 class.

中创建编码器和解码器

这是一个超级简单的自动编码器的例子 class:

INPUT_SHAPE = 254
class AutoEncoder(tf.keras.Model):
    def __init__(self):
        super().__init__()
        # Encoder
        self.dense1 = tf.keras.layers.Dense(128, input_shape=(INPUT_SHAPE,), activation='relu')
        self.dense2 = tf.keras.layers.Dense(INPUT_SHAPE, activation='relu')

        #Decoder
        self.dense3 = tf.keras.layers.Dense(128, activation='relu')
        self.dense4 = tf.keras.layers.Dense(3, activation='sigmoid')
    
    def __call__(self, inp, training=False):  
        x = self.dense1(inp)
        x = self.dense2(x)   

        x = self.dense3(x)
        x = self.dense4(x)
        return x

这将是 encoderdecoder 是分开的 classes,我的疑问是如何将两者结合起来?或者在这种情况下创建自动编码器的最佳方法是什么。

class Encoder(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.dense1 = tf.keras.layers.Dense(128, input_shape=(INPUT_SHAPE,), activation='relu')
        self.dense2 = tf.keras.layers.Dense(INPUT_SHAPE, activation='relu')
    
    def __call__(self, inp, training=False):        
        x = self.dense1(x)
        x = self.dense2(x)
        return x
    
class Decoder(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.dense3 = tf.keras.layers.Dense(128, input_shape=(INPUT_SHAPE,), activation='relu')
        self.dense4 = tf.keras.layers.Dense(3, activation='sigmoid')
        
    def __call__(self, inp, training=False):
        x = self.dense3(x)
        x = self.dense4(x)
        return x

您提供的代码中有 2 个小错误。喜欢 INPUT_SHAPE 未在 __init__ 中提供。另外,使用 call 方法而不是 __call__

class Encoder(tf.keras.Model):
    def __init__(self, INPUT_SHAPE):
        super(Encoder, self).__init__()
        self.dense1 = tf.keras.layers.Dense(128, input_shape=(INPUT_SHAPE,), activation='relu')
        self.dense2 = tf.keras.layers.Dense(INPUT_SHAPE, activation='relu')
    
    def call(self, inp, training=False):        
        x = self.dense1(x)
        x = self.dense2(x)
        return x
    
class Decoder(tf.keras.Model):
    def __init__(self, INPUT_SHAPE):
        super(Decoder, self).__init__()
        self.dense3 = tf.keras.layers.Dense(128, input_shape=(INPUT_SHAPE,), activation='relu')
        self.dense4 = tf.keras.layers.Dense(3, activation='sigmoid')
        
    def call(self, inp, training=False):
        x = self.dense3(x)
        x = self.dense4(x)
        return x

修复这些问题后。您可以使用以下

定义AE
class AE(tf.keras.Model):
  def __init__(self, INPUT_SHAPE):
    super(AE, self).__init__()
    self.encoder = Encoder(INPUT_SHAPE)
    self.decoder = Decoder(INPUT_SHAPE)

  def call(self, inp):
    out_encoder = self.encoder(inp)
    out_decoder = self.decoder(out_encoder)
    return out_encoder, out_decoder 

是时候采取一些行动了。让我们实例化这个 class 并检查对象。

INPUT_SHAPE = 10 
model = AE(10) 
model
>>>
<__main__.AE at 0x7f5bb4ef8dd8>

您还可以检查编码器和解码器

model.encoder
model.decoder

这将得到 <__main__.Encoder at 0x7f5bb4ed2710><__main__.Decoder at 0x7f5bb4ec99e8>