def build_autoencoder(input_shape, code_length=256):
input_img = keras.Input(shape=input_shape)
x = layers.Conv2D(16, (3, 3), strides=(2, 2), activation='relu', padding='same')(input_img)
x = layers.Conv2D(32, (3, 3), strides=(1, 1), activation='relu', padding='same')(x)
x = layers.Conv2D(64, (3, 3), strides=(1, 1), activation='relu', padding='same')(x)
x = layers.Conv2D(128, (3, 3), strides=(1, 1), activation='relu', padding='same')(x)
x = layers.Flatten()(x)
code_layer = layers.Dense(code_length, activation='sigmoid')(x)
x = layers.Dense((width // 2) * (height // 2) * 128, activation='relu')(code_layer)
x = layers.Reshape((width // 2, height // 2, 128))(x)
x = layers.Conv2DTranspose(128, (3, 3), strides=(2, 2), activation='relu', padding='same')(x)
x = layers.Conv2DTranspose(64, (3, 3), strides=(1, 1), activation='relu', padding='same')(x)
x = layers.Conv2DTranspose(32, (3, 3), strides=(1, 1), activation='relu', padding='same')(x)
output_img = layers.Conv2DTranspose(1, (3, 3), strides=(1, 1), activation='sigmoid', padding='same')(x)
autoencoder = keras.Model(input_img, output_img)
return autoencoder