在TensorFlow Functional API中使用同一图形保存和加载多个模型

mpo*_*tma 6 python keras tensorflow tf.keras tensorflow2.0

在TensorFlow Functional API指南中,显示了一个示例,其中使用同一层图创建了多个模型。(https://www.tensorflow.org/beta/guide/keras/functional#using_the_same_graph_of_layers_to_define_multiple_models

encoder_input = keras.Input(shape=(28, 28, 1), name='img')
x = layers.Conv2D(16, 3, activation='relu')(encoder_input)
x = layers.Conv2D(32, 3, activation='relu')(x)
x = layers.MaxPooling2D(3)(x)
x = layers.Conv2D(32, 3, activation='relu')(x)
x = layers.Conv2D(16, 3, activation='relu')(x)
encoder_output = layers.GlobalMaxPooling2D()(x)

encoder = keras.Model(encoder_input, encoder_output, name='encoder')
encoder.summary()

x = layers.Reshape((4, 4, 1))(encoder_output)
x = layers.Conv2DTranspose(16, 3, activation='relu')(x)
x = layers.Conv2DTranspose(32, 3, activation='relu')(x)
x = layers.UpSampling2D(3)(x)
x = layers.Conv2DTranspose(16, 3, activation='relu')(x)
decoder_output = layers.Conv2DTranspose(1, 3, activation='relu')(x)

autoencoder = keras.Model(encoder_input, decoder_output, name='autoencoder')
autoencoder.summary()
Run Code Online (Sandbox Code Playgroud)

是否可以在共享同一张图的同时保存和加载这两个模型?如果我以以下方式保存和加载它们:

# Save
encoder.save('encoder.h5')
autoencoder.save('autoencoder.h5')

# Load
new_encoder = keras.models.load_model('encoder.h5')
new_autoencoder = keras.models.load_model('autoencoder.h5')
Run Code Online (Sandbox Code Playgroud)

新的编码器和自动编码器将不再共享同一图形,因此不再一起训练。

rvi*_*nas 3

这是一个很酷的问题。编码器和自动编码器不再共享相同的图,因为它们被保存为不相交的模型。事实上,encoder它被保存了两次,因为它也嵌入在autoencoder.

要恢复两个模型,同时仍共享相同的图表,我建议采用以下方法:

  1. 命名 的encoder输出层。例如:

    encoder_output = layers.GlobalMaxPooling2D(name='encoder_output')(x)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 仅保存autoencoder

    autoencoder.save('autoencoder.h5')
    
    Run Code Online (Sandbox Code Playgroud)
  3. 恢复autoencoder

    new_autoencoder = keras.models.load_model('autoencoder.h5')
    
    Run Code Online (Sandbox Code Playgroud)
  4. encoder从恢复的图像中重建 的图autoencoder,以便它们共享公共层:

    encoder_input = new_autoencoder.get_layer('img').input
    encoder_output = new_autoencoder.get_layer('encoder_output').output
    new_encoder = keras.Model(encoder_input, encoder_output)
    
    Run Code Online (Sandbox Code Playgroud)

或者,您也可以保存/加载权重并手动重建图表。