使用 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
这将是 encoder
和 decoder
是分开的 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>
我想创建一个自动编码器子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
这将是 encoder
和 decoder
是分开的 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
修复这些问题后。您可以使用以下
定义AEclass 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>