【问题标题】:Create Autoencoder Model Using Keras Subclassing使用 Keras 子类化创建自动编码器模型
【发布时间】:2020-11-15 07:04:09
【问题描述】:

我想创建一个自编码器继承 Keras Model 类,我不知道是否可以分别创建编码器和解码器并将它们组合成一个新的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

【问题讨论】:

  • 我觉得没关系,编码器的输出应该传给解码器,你应该可以计算损失来训练它。

标签: python tensorflow keras deep-learning autoencoder


【解决方案1】:

您提供的代码中有 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​​p>

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

这将给出&lt;__main__.Encoder at 0x7f5bb4ed2710&gt;&lt;__main__.Decoder at 0x7f5bb4ec99e8&gt;

【讨论】:

    猜你喜欢
    • 2017-10-22
    • 2018-05-11
    • 2018-09-11
    • 2019-05-19
    • 2021-10-18
    • 1970-01-01
    • 2017-07-19
    • 2019-08-30
    • 2017-09-25
    相关资源
    最近更新 更多