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

2024-05-20 05:47:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个Keras模型类的autoencoder子类,我不知道是否需要分别创建编码器和解码器并将它们合并到一个新的AutoEncoder类中,或者我需要在同一个类中创建编码器和解码器

这是一个类中超级简单自动编码器的示例:

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是分开的类,我的疑问是如何将两者结合起来?或者,在这种情况下,创建自动编码器的最佳方法是什么

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

Tags: selfinputinitlayerstfdef编码器activation
1条回答
网友
1楼 · 发布于 2024-05-20 05:47:22

您提供的代码中有两个小错误。类似于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 

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

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

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

model.encoder
model.decoder

这将给出<__main__.Encoder at 0x7f5bb4ed2710><__main__.Decoder at 0x7f5bb4ec99e8>

相关问题 更多 >